[英]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();
當我運行代碼時,我收到錯誤消息:“一個很長的文件路徑名包含一個不正確的路徑”。
我的問題是:
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()
以使用\\\\?\\
前綴傳遞路徑。 使用接受HANDLE
的CFile
構造函數通過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.