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

joh*_* j. 6 windows file-management path filenames

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

为此,我使用 Windows 7 上的默认 Windows 文件管理器和以下 PowerShell 脚本:

Get-ChildItem | Select Name, FullName, @{N="Path Length";E={$_.FullName.Length}} | Format-List
Run Code Online (Sandbox Code Playgroud)

abc.txt我打开管理器,在 中创建文件C:\,然后在abc文件管理器允许的情况下添加字母。(当然,实际上我使用复制粘贴。这要快得多。)

C:\aaa然后我在和中进行相同的测试C:\aaa\bbb

由于某种原因,结果有所不同。C:\aaa和中的最大长度C:\aaa\bbb为 259 个字符,但 in 中的最大长度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
Run Code Online (Sandbox Code Playgroud)

更新

来自 mail-archive.com,Python 列表:

https://www.mail-archive.com/python-list@python.org/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/python-dev@python.org/msg106171.html

MAX_PATH,它将文件路径限制为微不足道的 259 个字符(没有终止 null);当前目录最多 258 个字符(不带尾部反斜杠且为空);新目录的路径长度为 247 个字符(从 259 个字符中减去 12 个字符,为 8.3 文件名留出空间)。

然而,第二句话对我来说没有意义。我不明白为什么这个人谈论尾随反斜杠。当我们谈论目录而不是文件时,尾部反斜杠可能是一种情况!

har*_*ymc 5

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

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

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

以下是我在 Windows 7 中的测试,我的发现证实了海报的结果:

在此输入图像描述

可以推导出以下规则:

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

这些毫无意义的结果强烈表明代码编写得很糟糕。

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

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

在寻找解释时,我推测 255 是 Microsoft 决定的文件名的真正限制,其余的实际上只是编写得很糟糕的代码。

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

在此输入图像描述

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

很明显,微软一直以来的意图是允许文件名长度为 255 个字符,但在 Windows 7 中,这一功能被考虑到路径的代码禁用了,而且没有任何充分的理由。

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

小轶事:根据微软错误守恒定律,Windows 10 资源管理器无法删除C:\C:\Temp和中的 255 个字符文件C:\Temp\abc。我必须在命令提示符中输入命令del 12*才能摆脱它们。(修复一个错误,同时引入另一个错误......)


Ram*_*und 2

\n

由于某种原因,结果有所不同。C:\\aaa 和 C:\\aaa\\bbb 中的最大长度为 259 个字符,但 C:\\ 中的最大长度为 258 个字符。为什么?

\n
\n

我认为您要问的是 Windows 资源管理器通常允许的最大路径长度是多少。 它\xe2\x80\x99s 260 个字符。

\n

路径可包含 248 个字符,文件名可包含 12 个字符。

\n

由于空字符,示例文件的名称有所不同。

\n
\n

在 Windows 10 版本 1607 之前的 Windows 版本中,路径的最大长度为 MAX_PATH,定义为 260 个字符。在更高版本的 Windows 中,需要更改注册表项或使用组策略工具来删除限制。

\n
\n
\n

在 Windows API 中(除了以下段落中讨论的一些例外情况),路径的最大长度为 MAX_PATH,定义为 260 个字符。本地路径按以下顺序构造:驱动器号、冒号、反斜杠、由反斜杠分隔的名称组件以及终止空字符。例如,驱动器 D 上的最大路径是“D:\\some 256-character path string”,其中“”表示当前系统代码页的不可见终止空字符。(此处使用字符 < > 是为了视觉清晰,并且不能是有效路径字符串的一部分。)

\n
\n

来源:

\n\n

  • 这回答了为什么我无法创建超过 259 个字符的路径(这是因为 260 个字符和 NUL 终止字符的限制),但它并没有回答为什么我无法在驱动器根目录中创建超过 258 个字符的路径。 (2认同)