在Windows中,为什么有260个字符的路径长度限制存在?

16 浏览
0 Comments

在Windows中,为什么有260个字符的路径长度限制存在?

我已经在不合适的时候遇到了这个问题多次:

  • 尝试在深层路径下使用开源Java项目
  • 在源代码控制中存储深层次的Fitnesse wiki树
  • 使用Bazaar导入我的源代码控制树时出现错误

为什么会存在这个限制?

为什么它还没有被移除?

你如何应对路径限制?并且,不,转换到Linux或Mac OS X不是对这个问题的有效回答;)

admin 更改状态以发布 2023年5月21日
0
0 Comments

这并不完全正确,因为NTFS文件系统支持最多32k个字符的路径。您可以使用Win32 API并在路径前加上"\\?\"前缀以使用超过260个字符。

来自.Net详细解释了长路径的问题。一个小节摘录了长路径的问题:

另一个问题是暴露长路径支持会导致不一致的行为。 带有\\?\前缀的长路径可以在大多数与文件相关的Windows API中使用,但并非所有的Windows API都支持长路径。例如,将模块映射到调用进程的地址的LoadLibrary,如果文件名超过MAX_PATH,则会失败。这意味着MoveFile将让您将DLL移动到路径超过260个字符的位置,但当您尝试加载该DLL时,它会失败。Windows API中有类似的例子;一些解决方法存在,但它们是针对特定情况的。

0
0 Comments

引用这篇文章:https://learn.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation

最大路径长度限制

在 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内存已经足够了。

0