2010-07-18 85 views
6

我正在尋找處理我的Windows應用程序中較長的文件路徑。C++ WinAPI:處理長文件路徑/名稱

目前,我有一個文本框(編輯框),其中用戶可以輸入絕對文件路徑。然後我讀了類型化的文件路徑,使用GetWindowText,到宣佈像這樣的字符串:TCHAR FilePath[MAX_PATH];

顯然,在這裏,我靠這限制了我260個字符的MAX_PATH不變。所以要處理更長的文件/路徑名稱,我可以像這樣擴展我的TCHAR數組:TCHAR FilePath[32767];

或者還有更好的方法嗎?我可以使用可變長度數組嗎? (TCHAR FilePath[];這是甚至可能在C++? - 對不起,我很新)。

謝謝先進!


這裏是什麼,我上面提到的整個代碼片段:

TCHAR FilePath[MAX_PATH]; 
ZeroMemory(&FilePath, sizeof(FilePath)); 
GetWindowText(hWndFilePath, FilePath, MAX_PATH); 
+3

這就是'MAX_PATH'的目的 - 你不能有比這更長的路徑。 – casablanca 2010-07-19 00:05:38

+0

@casablanca但是,最好用MAX_PATH + 1聲明最後的'\ 0'字符是個好主意。 – luiscubal 2010-07-19 00:11:31

+0

@luiscabal:我剛剛檢查了[MSDN](http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx#maxpath),它看起來像MAX_PATH包含空終止符。 – casablanca 2010-07-19 00:16:36

回答

11

對於Windows上的文件路徑存在許多限制。默認情況下,路徑不能超過260個字符,這是常數所用的。

但是,您可以可以訪問較長的路徑 - 有一定的限制 - 通過在路徑前加「\\?\」。然而,使用「\\。\?」前綴通常遠遠大於利益的侷限性:

  1. 有一些是做這個前綴不支持路徑的Win32 API(例如,LoadLibrary總是在失敗路徑超過260個字符)
  2. Win32 Canonicalization規則在使用「\\?\」前綴時不起作用。例如,默認情況下,路徑中的「/」被轉換爲「\」,「。」。和「..」分別轉換爲對當前目錄和父目錄的引用等等:當使用「\\?\」前綴時,不會發生這種情況。
  3. 僅僅因爲您可以修改程序以支持更長的路徑,其他程序可能無法打開您創建的文件。這將是這種情況,如果其他程序不使用「\\?\」前綴。

說實話,第二點是真正的殺手鐗:使用「\\?\」前綴打開自己,遇到各種麻煩,你基本上必須自己重新實現Win32規範化規則如果你走這條路。

因此,我的建議是堅持260限制。至少直到有更好的平臺支持更長的路徑。

+0

感謝您的建議。我想我會按照你的建議! – user353297 2010-07-19 09:12:28

+0

對於#2,請注意[GetFullPathNameW](https://msdn.microsoft.com/library/aa364963)爲您執行此規範化,並且**不限於MAX_PATH,除非您將其指定爲緩衝區大小。 (在*調用GetFullPathName之後,前綴爲\\?\ only *的路徑)。一些其他注意事項:1)UNC路徑必須使用\\?\ UNC \來代替\\。 2)DOS設備,如NUL或somedir \ NUL被轉換爲\\。\ NUL,但\\。\在任何地方都不起作用(並且\\?\ UNC \。\ NUL是完全不同的東西)。 3)\\?\ C:\ NUL可以創建一個很難處理的文件。 – Lexikos 2018-02-03 01:56:25

-4

沒有,因爲如果你得到一個更長的路徑,Windows無法接受。所以在技術上,你可以容納比緩衝區中更多的字符,你永遠不可能實際使用文件路徑結果。

5

這取決於你正在寫什麼樣的程序。我自己的策略通常是將路徑創建爲長度限制爲MAX_PATH,但能夠讀取現有的來自更長路徑的數據(使用院長在他的回答中提到的「\?\」前綴)。但也有例外 - 例如,備份程序應該接受長路徑,並且必須準確地再現它作爲輸入的內容。

儘管Dean當然是正確的,Windows沒有爲您規範更長的路徑,但我有而不是發現這是一個普遍的問題。這通常並不意味着編寫自己的代碼來規範路徑 - 它通常意味着讓用戶以一種根本不會生成此類事物的方式輸入路徑。