路徑長度上限
在 Windows API 中(下列段落中討論的一些例外狀況),路徑的最大長度是 MAX_PATH,定義為 260 個字元。 本機路徑的結構化順序如下:驅動器號、冒號、反斜杠、以反斜杠分隔的名稱元件,以及終止的 Null 字元。 例如,磁碟驅動器 D 上的最大路徑是 「D:\some 256 字元路徑字串<NUL」,其中 「<NUL>>」 代表目前系統代碼頁的不可見終止 Null 字元。 (字元 <> 這裡用於視覺清楚,不能是有效路徑字串的一部分。
例如,如果您要將具有長檔名的 Git 存放庫複製到本身具有長名稱的資料夾,您可能會達到此限制。
注意
Windows API 中的檔案 I/O 函式會將 “/” 轉換為 “\” 作為將名稱轉換成 NT 樣式名稱的一部分,但使用 “\\?\” 前置詞時,如下列各節所述。
Windows API 有許多函式,也具有 Unicode 版本,可允許擴充長度路徑,最大路徑長度為 32,767 個字元。 此路徑類型是由反斜杠分隔的元件所組成,每個元件最多都由 GetVolumeInformation 函式的 lpMaximumComponentLength 參數中所傳回的值所組成(此值通常是 255 個字元)。 若要指定延伸長度的路徑,請使用 “\\?\” 前置詞。 例如,“\\?\D:\long path”。
注意
32,767 個字元的最大路徑大約是近似值,因為 “\\?\” 前置詞可能會在運行時間由系統擴充為較長的字串,而且此擴充適用於總長度。
“\\?\” 前置詞也可以與根據通用命名慣例 (UNC) 建構的路徑搭配使用。 若要使用 UNC 指定這類路徑,請使用 “\\?\UNC\” 前置詞。 例如,“\?\UNC\server\share”,其中“server” 是計算機的名稱,而 “share” 是共用文件夾的名稱。 這些前置詞不會當做路徑本身的一部分使用。 它們表示路徑應該以最少的修改傳遞至系統,這表示您無法使用正斜線來表示路徑分隔符,或表示目前目錄的句點,或雙點來表示父目錄。 因為您無法將 “\\?\” 前置詞與相對路徑搭配使用,所以相對路徑一律限制為 總MAX_PATH 個字元。
不需要在路徑和檔名字符串上執行任何 Unicode 正規化,以供 Windows 檔案 I/O API 函式使用,因為文件系統會將路徑和檔名視為 WCHAR 的不透明序列。 應用程式需要的任何正規化,都應該考慮到這一點,而對相關 Windows 檔案 I/O API 函式的任何呼叫外部。
使用 API 建立目錄時,指定的路徑不能太長,您無法附加 8.3 檔名(也就是說,目錄名稱不能超過 MAX_PATH 減 12)。
殼層和文件系統有不同的需求。 使用 Windows API 建立路徑,殼層使用者介面無法正確解譯。
在 Windows 10 版本 1607 和更新版本中啟用長路徑
從 Windows 10 版本 1607 開始, 已從許多常見的 Win32 檔案和目錄函式中移除MAX_PATH 限制。 不過,您的應用程式必須加入加入新的行為。
若要為每個應用程式啟用新的長路徑行為,必須符合兩個條件。 必須設定登錄值,而且應用程式指令清單必須包含專案 longPathAware
。
啟用長路徑的登錄設定
重要
瞭解啟用此登錄設定只會影響已修改以利用新功能的應用程式。 開發人員必須宣告其應用程式為長路徑感知,如下列應用程式指令清單設定中所述。 這不是會影響所有應用程式的變更。
登入值 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)
必須存在,且設定為 1
。 系統會在第一次呼叫受影響的 Win32 檔案或目錄函式之後,由系統快取登錄值(請參閱下方的函式清單)。 登錄值將不會在進程的存留期內重載。 為了讓系統上的所有應用程式都能辨識此值,可能需要重新啟動,因為某些進程可能已在設定金鑰之前啟動。
您也可以將此程式代碼 .reg
複製到可為您設定此設定的檔案,或使用具有更高權限的終端機視窗的 PowerShell 命令:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001
注意
此登錄設定也可以透過位於的 Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths
組策略來控制。
應用程式指令清單更新以宣告長路徑功能
應用程式指令清單也必須包含 longPathAware
專案。
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
<ws2:longPathAware>true</ws2:longPathAware>
</windowsSettings>
</application>
沒有MAX_PATH限制的函式
如果您加入加入長路徑行為,這些目錄管理功能就不再有 MAX_PATH 限制:CreateDirectoryW、CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW。
如果您加入加入長路徑行為,這些檔案管理功能不再MAX_PATH限制:CopyFileW、CopyFile2、CopyFileExW、CreateFileW、CreateFile2、CreateHardLinkW、CreateSymbolicLinkW、DeleteFileW、 FindFirstFileW、FindFirstFileExW、FindNextFileW、GetFileAttributesW、GetFileAttributesExW、SetFileAttributesW、GetFullPathNameW、GetLongPathNameW、MoveFileW、MoveFileExW、MoveFileWithProgressW、ReplaceFileW、SearchPathW、FindFirstFileNameW、FindNextFileNameW、FindFirstStreamW、FindNextStreamW、GetCompressedFileSizeW、GetFinalPathNameByHandleW。