簡體   English   中英

如何在Windows中使用MFC時文件路徑名超過255個字符時創建文件?

[英]How can I create a file when file path name is over 255 characters using MFC in Windows?

我在Windows中工作,使用vc ++ 2010和MFC。

以下是我的代碼:

CFile File;
TCHAR lpCause[1024];
CFileException eException;
CString strErrorMessage;
//  a very long file path name means a file name over 255 characters
if (!File.Open(_T("a very long file path name"), CFile::modeCreate, &eException))
{
    eException.GetErrorMessage(lpCause, 1024);
    strErrorMessage = lpCause;
}
else
    File.Close();

當我運行代碼時,我收到錯誤消息:“一個很長的文件路徑名包含一個不正確的路徑”。

我的問題是:

  1. 如何修改我的代碼使其工作?
  2. 我知道CreateFile()函數可以在文件路徑的開頭添加"\\\\\\\\?\\" ,然后它會將此限制擴展到32767寬字符。如何在MFC中執行相同的操作?

原因

CFile::Open()的源代碼中,有一個顯式檢查路徑長度是否超過_MAX_PATH

if (lpszFileName != NULL && SUCCEEDED(StringCchLength(lpszFileName, _MAX_PATH, NULL)) )

如果超出_MAX_PATH ,則該函數設置pException->m_cause = CFileException::badPath並返回FALSE

即使對於VS2017附帶的MFC版本也是如此。

因此,繞過_MAX_PATH限制的標准技術,即使用\\\\?\\為路徑添加前綴將不起作用。

可能的解決方案

直接調用CreateFileW()以使用\\\\?\\前綴傳遞路徑。 使用接受HANDLECFile構造函數通過CFile對象管理文件。 CFile對象將獲取句柄的所有權,因此您不能在句柄上調用CloseHandle()

HANDLE hFile = CreateFileW( L"\\\\?\\a very long file path name", GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, 0, NULL );
if( hFile != INVALID_HANDLE_VALUE )
{
    // Manage the handle using CFile
    CFile file( hFile );
    // Use the file...

    // The CFile destructor closes the handle here. 
}
else
{
    DWORD err = GetLastError();
    // TODO: do your error handling...
}

另一種可能性是從CFile派生一個覆蓋CFile::Open() (它是虛擬的)的類。 對於實現復制/粘貼MFC源,但忽略_MAX_PATH檢查。 對於一個大項目,這個類可以成為CFile替代品,以實現長路徑。 你甚至可以在前面添加\\\\?\\前綴,如果它還沒有(但由於前綴也會禁用從Win32路徑到NT風格路徑的常規轉換,如轉換/\\ ,解析點等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM