翻译《The Old New Thing》- 解除路径的 MAX_PATH 限制仅适用于路径本身
Removing the MAX_PATH restriction on paths applies only to paths - The Old New Thinghttps://devblogs.microsoft.com/oldnewthing/20250611-00/?p=111262
问题描述
一位客户在使用 Windows 长路径时遇到问题:尽管使用了 \\?\
长路径前缀,仍然无法创建长路径文件。
客户查阅文档后确认,\\?\
前缀始终可用,并进一步通过注册表键和应用程序清单(manifest)启用了无需 \\?\
的长路径支持,但问题依旧存在。
客户提供了示例程序,路径为:
C:\looooooooo[此处省略1000个字母o]ooong.txt
该路径总长度远低于 32,767 字符的限制,为何仍无法使用?
根本原因
虽然 \\?\
前缀和系统设置可以将完整路径的长度限制提升至 32,767 字符,但路径中**每个单独组成部分(如文件名或文件夹名)**的长度仍受限制。
可通过调用 GetVolumeInformation
查询卷的最大组件长度(lpMaximumComponentLength
),常见值包括:
-
255 字符(exFAT、NTFS)
-
110 字符(Joliet CD-RW Unicode 模式)
-
网络卷由网络协议决定
客户示例中的文件名超过 1000 字符,显然超出了文件系统的最大组件长度限制,因此操作失败。
解决方案与建议
-
缩短单个组件长度:
将路径拆分为多个较短的组成部分(例如每个不超过 100 字符),但总长度仍超过MAX_PATH
(260 字符)。
例如:
C:\short\short\short\...\short.txt
(总长度 >260,但每个组件 <100) -
理解 32,767 字符的实际限制:
该限制包含系统内部处理时的扩展开销,实际可用长度略低于 32,767。
总结
-
\\?\
和系统设置仅解除完整路径的长度限制,不解除单个路径组件的长度限制。 -
文件系统对文件名/文件夹名的长度有独立限制,需通过
GetVolumeInformation
查询。 -
设计长路径时,需同时考虑完整路径长度和单个组件长度。