文件路径的最大长度:259 还是 258 个字符?

文件路径的最大长度:259 还是 258 个字符?

我试图了解文件路径的最大有效长度是多少。

为此,我使用 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 个字符,但 中的最大长度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。其中,12 代表 8.3 文件名,1 代表 NUL 终止符。例如,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 个字符(不包括终止空字符);将当前目录限制为 258 个字符(不包括尾随反斜杠和空字符);将新目录的路径限制为 247 个字符(从 259 中减去 12 个,为 8.3 文件名留出空间)。

但是,第二个引号对我来说毫无意义。我不明白为什么这个人会提到末尾的反斜杠。末尾的反斜杠可能是我们谈论目录时的情况,而不是文件的情况!

答案1

我对这种差异有一个简单的解释:Windows 7 中的错误代码,在 Windows 10 中被重新编写。下面我将说明我为什么这么认为,以及 Windows 7 和 10 中文件名长度的规则是什么。

但首先,我要说一句:260 的限制 最大路径 是早期 Windows 版本的产物。它无法更改,因为 Windows API 在其数据结构中大量使用了它,例如 WIN32_FIND_DATA,因此在 API 中增加它会导致现有应用程序内存溢出。这就是为什么必须在 注册表 程序需要在其清单中声明其处理长名称的能力。

我还注意到,驱动器号 ( C:\) 仅包含在文本中,与 Windows 磁盘表 (MFT) 无关。Windows 很清楚文件位于哪个磁盘上。

以下是我在 Windows 7 中进行的测试,我的发现证实了发布者的观点:

在此处输入图片描述

可以得出以下规则:

  • 驱动器号不进入限制计算(C:
  • 前导反斜杠不参与极限计算 ( C:\)
  • 其余部分限制为 256 个字符,其中包括中间的反斜杠
  • 根文件最多可包含 255 个字符,而文件夹中的文件则无法做到这一点。

这些毫无意义的结果有力地证明了代码编写的缺陷。

首先,就 MFT 而言,每个路径组件都是独立的,并且具有与任何其他组件(子文件夹)完全相同的长度限制,因此磁盘表本身没有理由限制文件名的长度,仅仅因为它们包含在某个文件夹中。

其次,我们有一个问题,为什么根文件限制为 255 个字符,而它似乎应该是 256 个,因为它是其路径中唯一的元素(我们看到它可以达到 256 个字符)。

在寻找解释的过程中,我推测 255 是微软决定的文件名的真正限制,其余的实际上只是写得很差的代码。

为了验证这个理论,我测试了 Windows 10 的行为。我在下面重复了相同的操作(写入需要管理员权限C:\):

在此处输入图片描述

如上所示,这里的行为更加合乎逻辑:路径的中间组件不再计算限制文件名的大小,文件名始终为 255 个字符。

很明显,微软的意图一直是允许使用 255 个字符的文件名,但是 Windows 7 中考虑路径的代码禁用了此功能,而且没有什么真正好的理由。

进一步挖掘后,发现了 NTFS 的文档 属性 - $FILE_NAME (0x30),它指定一个字节作为文件名的长度(偏移量 0x40)。这很好地解释了 255 个字符的限制。(另请参阅 FireEye 第 2 部分:文件名属性的内部结构)。

小轶事:根据微软的错误守恒定律,Windows 10 资源管理器无法删除、和中的 255 个字符的文件C:\C:\TempC:\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 个字符。

相关内容