我嘗試了解文件路徑的最大有效長度是多少。
為此,我使用 Windows 7 上的預設 Windows 檔案總管和以下 PowerShell 腳本:
Get-ChildItem | Select Name, FullName, @{N="Path Length";E={$_.FullName.Length}} | Format-List
abc.txt
我打開管理器,在 中建立文件C:\
,然後在abc
文件管理器允許的情況下添加字母。 (當然,實際上我使用複製貼上。這要快得多。)
C:\aaa
然後我在和中進行相同的測試C:\aaa\bbb
。
由於某種原因,結果有所不同。C:\aaa
和中的最大長度C:\aaa\bbb
為 259 個字符,但 in 中的最大長度C:\
為 258 個字符。為什麼?
C:\abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefgh.txt
258 characters
C:\aaa\abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcde.txt
259 characters
C:\aaa\bbb\abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_a.txt
259 characters
更新
來自 mail-archive.com,Python 清單:
(https://www.mail-archive.com/[電子郵件受保護]/msg444514.html)
經典的 DOS 路徑長度限制(例如 247、258 或 259 個字符,取決於上下文)。
以下解釋是我的。
247 代表目錄路徑的最大長度:260 - 12 - 1 = 247。例如,C:\foo
或者C:\foo\bar
259代表路徑的最大長度文件(不是目錄)位於不是在磁碟機的根目錄中。例如,C:\foo\aaa.txt
258代表路徑的最大長度文件(不是目錄)位於在驅動器的根目錄。例如,C:\aaa.txt
所以其實有 3 個限制:247、258 和 259。
但是為什麼我們對驅動器根目錄中的檔案有 258 個限制,而對其他目錄中的檔案有 259 個限制呢?
也可以看看:https://www.mail-archive.com/[電子郵件受保護]/msg106171.html
MAX_PATH,它將檔案路徑限制為微不足道的 259 個字元(沒有終止 null);目前目錄最多 258 個字元(不含尾部反斜線且為空);新目錄的路徑長度為 247 個字符(從 259 個字符中減去 12 個字符,為 8.3 文件名留出空間)。
然而,第二句話對我來說沒有意義。我不明白為什麼這個人談論尾隨反斜線。當我們談論目錄而不是文件時,尾部反斜線可能是一種情況!
答案1
我對這種差異有一個簡單的解釋:Windows 7 中的錯誤代碼,在 Windows 10 中重新編寫。
但首先,有一點小小的評論:260 的限制 最大路徑 是早期 Windows 版本的產物。它無法更改,因為 Windows API 在其資料結構中大量使用它,例如 WIN32_FIND_DATA,因此在 API 中增加它會導致現有應用程式記憶體溢出。這就是為什麼必須在 註冊表 並且程式需要在其清單中聲明其處理長名稱的能力。
我還注意到,磁碟機號碼 ( C:\
) 僅包含在文字中,與 Windows 磁碟表 (MFT) 無關。 Windows 非常清楚該檔案駐留在哪個磁碟上。
以下是我在 Windows 7 中的測試,我的發現證實了海報的結果:
可以推導出以下規則:
- 磁碟機代號不參與限制計算 (
C:
) - 前導反斜線不參與極限計算 (
C:\
) - 其餘部分限制為 256 個字符,其中包括中間反斜杠
- 根文件最多可以包含 255 個字符,而資料夾中的文件則無法做到這一點。
這些毫無意義的結果強烈表明程式碼編寫得很糟糕。
對於初學者來說,就 MFT 而言,每個路徑元件都是獨立的,並且與任何其他元件(子資料夾)具有完全相同的長度限制,因此磁碟表沒有固有的理由來限制長度檔案名稱只是因為它們包含在某個資料夾中。
其次,我們有一個問題,為什麼根檔案限制為 255 個字符,而它看起來應該是 256 個字符,因為它是其路徑中唯一的元素(我們看到可以達到 256 個字符)。
在尋找解釋時,我推測 255 是 Microsoft 決定的檔案名稱的真正限制,其餘的實際上只是編寫得很糟糕的程式碼。
為了驗證這個理論,我測試了 Windows 10 的行為C:\
。
如上所示,這裡的行為更合乎邏輯:路徑的中間部分不再限製檔案名稱的大小,檔案名稱的大小始終為 255 個字元。
很明顯,微軟一直以來的意圖是允許文件名長度為 255 個字符,但在 Windows 7 中,這一功能被考慮到路徑的代碼禁用了,而且沒有任何充分的理由。
進一步挖掘發現了 NTFS 的文檔 屬性 - $FILE_NAME (0x30),它指定一個位元組作為檔案名稱的長度(位於偏移量 0x40 處)。這很好地解釋了 255 個字元的限制。 (另請參閱火眼 第 2 部分:檔案名稱屬性的內部結構)。
小軼事:根據微軟錯誤守恆定律,Windows 10 資源管理器無法刪除 、和C:\
中的 255 個字元檔案。我必須在命令提示字元中輸入命令才能擺脫它們。 (修復一個錯誤,同時引入另一個錯誤......)C:\Temp
C:\Temp\abc
del 12*
答案2
由於某種原因,結果有所不同。 C:\aaa 和 C:\aaa\bbb 中的最大長度為 259 個字符,但 C:\ 中的最大長度為 258 個字符。為什麼?
我認為您要問的是 Windows 資源管理器通常允許的最大路徑長度是多少。 共 260 個字元。
路徑可包含 248 個字符,檔案名稱可包含 12 個字符。
由於空字符,範例文件的名稱有所不同。
在 Windows 10 版本 1607 之前的 Windows 版本中,路徑的最大長度為 MAX_PATH,定義為 260 個字元。在較高版本的 Windows 中,需要變更登錄機碼或使用群組原則工具來刪除限制。
在 Windows API 中(除了以下段落中討論的一些例外),路徑的最大長度是 MAX_PATH,定義為 260 個字元。本機路徑依下列順序建構:磁碟機號碼、冒號、反斜線、由反斜線分隔的名稱元件以及終止空白字元。例如,磁碟機 D 上的最大路徑是“D:\some 256-character path string”,其中“”表示目前系統代碼頁的不可見終止空字元。 (此處使用字元 < > 是為了視覺清晰,並且不能是有效路徑字串的一部分。)
來源:
答案3
有兩個限制要考慮:一個是最大路徑長度,另一個是最大檔名長度。在 NTFS 上,檔案名稱最多可包含 255 個 UTF-16 碼點,沒有空字節(請參閱第 12 頁)。
abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefgh.txt
長度正好是 255 個字元。