在Windows中,为什么有260个字符的路径长度限制存在?
在Windows中,为什么有260个字符的路径长度限制存在?
我已经在不合适的时候遇到了这个问题多次:
- 尝试在深层路径下使用开源Java项目
- 在源代码控制中存储深层次的Fitnesse wiki树
- 使用Bazaar导入我的源代码控制树时出现错误
为什么会存在这个限制?
为什么它还没有被移除?
你如何应对路径限制?并且,不,转换到Linux或Mac OS X不是对这个问题的有效回答;)
这并不完全正确,因为NTFS文件系统支持最多32k个字符的路径。您可以使用Win32 API并在路径前加上"\\?\
"前缀以使用超过260个字符。
来自.Net
另一个问题是暴露长路径支持会导致不一致的行为。 带有
\\?\
前缀的长路径可以在大多数与文件相关的Windows API中使用,但并非所有的Windows API都支持长路径。例如,将模块映射到调用进程的地址的LoadLibrary,如果文件名超过MAX_PATH,则会失败。这意味着MoveFile将让您将DLL移动到路径超过260个字符的位置,但当您尝试加载该DLL时,它会失败。Windows API中有类似的例子;一些解决方法存在,但它们是针对特定情况的。
最大路径长度限制
在 Windows API 中(以下段落讨论的特殊情况除外),路径的最大长度为 MAX_PATH,它被定义为 260 个字符。本地路径的结构顺序为:驱动器字母,冒号,反斜杠,由反斜杠分隔的文件名组件,以及终止空字符。例如,D 驱动器上的最大路径为 "D:\一些 256 个字符的路径字符串
",其中 " " 代表当前系统代码页中不可见的终止空字符。 (此处使用的 < > 字符仅用于视觉清晰度,不能成为有效路径字符串的一部分。)
现在我们可以看到这是 1 + 2 + 256 + 1,即 [驱动器][:\][路径][空] = 260。人们可以假定 256 是来自 DOS 时代的一个合理的字符串固定长度。回到 DOS API,我们意识到系统按驱动器跟踪当前路径,我们有最大 26(带符号的最多 32 个)个驱动器(和当前目录)。
INT 0x21 AH=0x47 意味着“此函数返回不带驱动器字母和起始反斜杠的路径描述”。因此,我们看到系统将 CWD 存储为一对(驱动器,路径),并且您通过指定驱动器(1=A,2=B,...)请求路径,如果您指定了 0,则它会假定 INT 0x21 AH=0x15 AL=0x19 返回的驱动器路径。所以现在我们知道为什么是 260 而不是 256,因为这 4 个字节未存储在路径字符串中。
为什么路径字符串只有256个字节,因为640k内存已经足够了。