2015-10-08 47 views
0

FindExecutable在結果緩衝區中返回一個截斷的文件名。是否由於文件名超過8個字符的事實?FindExecutable在C++中截斷文件名

代碼:

strPath = "test12345.exe"; 
CString strDiraa = "c:\\test\\test"; 

TCHAR szExe[1024]; 
::FindExecutable(
    strFile,         // pointer to filename 
    strDir.IsEmpty() ? 0 : LPCTSTR(strDir),  // pointer to default directory 
    szExe          // result-buffer 
    ); 

szExec:\test\test\TEST12~1.EXE但它應該是c:\test\test\TEST12345.EXE

有沒有一種方法可以擁有正確的名稱?

+0

這是傳統* 8.3 *(簡稱)格式名稱,您使用的是哪個版本的Windows?另外爲什麼你在EXE上使用FindExecutable? –

+0

[LPCTSTR lpFile - 此文件應該是一個文檔](https://msdn.microsoft.com/en-us/library/windows/desktop/bb776419%28v=vs.85%29.aspx?f=255&MSPPError=- 2147217396) – crashmstr

+0

你也有一個很大的混合變量名稱('strPath' vs'strFile','strDiraa' vs'strDir')。 – crashmstr

回答

0

是,FindExecutable給你一個「短」路徑名稱:這是所有文件夾和文件名trucated 8個字符(加上擴展名)的路徑名,使用時髦的DOS語法(該~1的東西)。

瞭解更多關於路徑名的位置:Naming Files, Paths, and Namespaces

長話短說,你必須使用GetFullPathName對「DOSified」路徑名,以獲得完整的文件路徑:

TCHAR szExe[1024]; 
::FindExecutable(
    strFile,         // pointer to filename 
    strDir.IsEmpty() ? 0 : LPCTSTR(strDir),  // pointer to default directory 
    szExe          // result-buffer 
    ); 

TCHAR fullPathName[1024]; 
GetFullPathName(szExe, sizeof(fullPathName), fullPathName, 0); 
+0

我不確定這是否正確。爲什麼FindExecutable會尋找短名稱。甚至可能沒有一個。更可能的是該文件類型是使用可執行文件的短名稱進行註冊的。 –

+0

@DavidHeffernan是的,這是正確的,這與FindExecutable無關。我會編輯。 – slaphappy

+0

@DavidHeffernan實際上,似乎OP在一個可執行文件上調用了'FindExecutable',以獲得完整的路徑名,所以在這裏沒有讀到註冊表(?) – slaphappy