【问题标题】:Maximum filename length in NTFS (Windows XP and Windows Vista)?NTFS 中的最大文件名长度(Windows XP 和 Windows Vista)?
【发布时间】:2010-09-20 21:57:10
【问题描述】:

我正在设计一个数据库表,它将保存上传文件的文件名。 Windows XP 或 Vista 使用的 NTFS 文件名的最大长度是多少?

【问题讨论】:

  • 我从来没有见过这么多不同的答案来回答应该是一个简单的问题。 199、255、256、257、260、“大约 30,000”、“大约 32,000”和“视情况而定”。当然,有限定词,但它们不可能都是正确的,不是吗?
  • 它的 255,我知道这一点,因为我必须构建一个应用程序来防止企业用户访问它,因为它会导致我们的存储服务器出现问题。
  • @RobertPitt。你在那里遗漏了一些东西。引用 MSDN:“路径的最大长度为 MAX_PATH,定义为 260 个字符”
  • @Michael9000。我相信 RobertPitt 引用的是文件名限制(这就是这个问题的意义所在),而不是路径限制。
  • NTFS 完全不限于 MAX_PATH,Windows Shell 仅限于 MAX_PATH,NTFS 最大路径长度为 32k

标签: windows-vista windows-xp ntfs filenames name-length


【解决方案1】:

文件名的各个组成部分(即路径上的每个子目录和最终文件名)限制为 255 个字符,总路径长度限制为大约 32,000 个字符。

但是,在 Windows 上,您不能超过 MAX_PATH 值(文件 259 个字符,文件夹 248 个字符)。详情请参阅http://msdn.microsoft.com/en-us/library/aa365247.aspx

【讨论】:

  • 以下是证实此答案的更多事实(Windows 通常限制为 260 个字符):msdn.microsoft.com/en-us/library/…blogs.msdn.com/b/bclteam/archive/2007/02/13/…
  • 对 NTFS 正确,对 Windows 不正确,根据您提供的链接:“在 Windows API(以下段落中讨论的一些例外情况)中,路径的最大长度是 MAX_PATH,其中定义为 260 个字符”。 total 路径,出于所有实际目的,限制为 259 个字符(允许空终止符)。
  • 显然,如果您使用 Windows API 文件方法的“unicode 版本”,如果您在路径名前加上“\\?\”,则最多可以达到 32767,对吗?
  • @rogerdpack:对于完整路径,是的,但是每个单独的组件(子文件夹/最终文件)有 255 个 utf-16 代码点的限制。另外,普通软件需要 MAX_PATH,所以... boom :)
  • 在 Windows 10(版本 1607 - 周年更新)和 Windows Server 2016 中,您可以选择通过覆盖组策略条目来忽略 MAX_PATH 问题,在计算机配置 -> 管理模板下启用 NTFS 长路径-> 系统 -> 文件系统:
【解决方案2】:

这是框架 4.5 在尝试保存具有长文件名的文件时所说的“未处理的异常”:

指定的路径、文件名或两者都太长。完全限定文件名必须少于 260 个字符,目录名必须少于 248 个字符。

【讨论】:

    【解决方案3】:

    This part of the official documentation 明确表示对于 NTFS、exFAT 和 FAT32 是 255 个 Unicode 字符,对于 UDF 是 127 个 Unicode 或 254 个 ASCII 字符。

    除此之外,最大路径名长度始终为 32,760 个 Unicode 字符,每个路径组件不超过 255 个字符。

    【讨论】:

    • 足够接近了。正如我在对已接受答案的评论中指出的那样,它是 32767 WCHAR 元素。不,它不是“Unicode 字符”(检查您的 Unicode 术语:代码点、字符等...!)。
    【解决方案4】:

    NTFS 中的长度为 255。NTFS 的$Filename 属性中的NameLength 字段是一个没有偏移的字节;这会产生 0-255 的范围。

    文件名本身可以在不同的“命名空间”中。到目前为止,有:POSIX、WIN32、DOS 和(WIN32DOS - 当文件名本身可以是 DOS 名称时)。 (由于字符串有长度,它可以包含 \0 但这会产生问题并且不在上面的命名空间中。)

    因此,文件或目录的名称最多可包含 255 个字符。在 Windows 下指定完整路径时,您需要 prefix the path with \\?\ (or use \\?\UNC\server\share for UNC paths) 将此路径标记为扩展长度的路径(约 32k 个字符)。如果您的路径较长,则必须沿途设置工作目录(呃 - 由于进程范围的设置而产生的副作用)。

    【解决方案5】:

    我无法在 WS 2012 Explorer 中创建名称+句点+扩展名超过 224 个字符的文件。不要向信使开枪!

    在同一服务器的 CMD 中,我无法创建超过 235 的字符名称:

    系统找不到指定的路径。

    在资源管理器中创建的具有 224 个字符名称的文件无法在 Notepad++ 中打开 - 它只是提供了一个新文件。

    【讨论】:

    • The system cannot find the path specified.The specified path, file name, or both are too long. 不同。我猜你有错字什么的。如果您尝试在不存在的路径中创建文件或想要移动到不存在的方向,则会收到该消息。
    【解决方案6】:

    根据MSDN,它是 260 个字符。它包括"<NUL>" - 不可见的终止空字符,因此实际长度为259。

    但是看文章,有点复杂。

    【讨论】:

    • 实际上,引用的 MSDN 文章说 path 限制为 260 个字符,但 filename 的长度取决于文件系统(但通常为 255 个字节)。但是,可以使用“Unicode 版本 [Windows API 函数]”将路径限制提高到 32767 字节,但是 Windows 在内部将运行时所需的 \\?\ 前缀扩展为某个未指定的长度,从而减少了该限制。此扩展后路径必须保持在 32767 字节以下。
    【解决方案7】:

    其实是256,见File System Functionality Comparison, Limits

    http://fixunix.com/microsoft-windows/30758-windows-xp-file-name-length-limit.html上重复发帖

    “假设我们谈论的是 NTFS 而不是 FAT32,那么“255 个字符 for path+file" 是资源管理器的限制,而不是文件系统本身。 NTFS 支持最长 32,000 个 Unicode 字符的路径,每个 组件最多 255 个字符。

    Explorer - 和 Windows API- 将您限制为 260 个字符 路径,其中包括驱动器号、冒号、分隔斜线和 终止空字符。可以读取更长的路径 Windows 如果你用 \\" 启动它"

    如果您阅读了上述帖子,您会发现您可以确定的第五件事是: 找到至少一个顽固的计算机用户!

    【讨论】:

    • 否 - 它是 255。NTFS $Filename 属性中的 NameLength 字段是一个没有偏移的字节;这产生的范围为 0-255
    • “每个组件最多 255 个字符” - 正如您自己编写的那样。
    【解决方案8】:

    238! 我用下面的bat脚本在Win7 32位下检查了一下:

    set "fname="
    for /l %%i in (1, 1, 27) do @call :setname
    @echo %fname%
    for /l %%i in (1, 1, 100) do @call :check
    goto :EOF
    :setname
    set "fname=%fname%_123456789"
    goto :EOF
    :check
    set "fname=%fname:~0,-1%"
    @echo xx>%fname%
    if not exist %fname% goto :eof
    dir /b
    pause
    goto :EOF
    

    【讨论】:

    • 我在 Windows 7 下使用能够正确处理长路径的程序对其进行了检查。每个单独的路径段可以占用 255 个字符(我使用了w)。那么现在呢?
    • 不,您(无意中)检查的是 MAX_PATH 260 的限制(259 没有空终止符)。将C:\ 作为当前目录再试一次。
    【解决方案9】:

    根据新的 Windows SDK 文档 (8.0),似乎提供了新的路径限制。有一组新的path handling functions 和 PATHCCH_MAX_CCH 的定义如下:

    // max # of characters we support using the "\\?\" syntax
    // (0x7FFF + 1 for NULL terminator)
    #define PATHCCH_MAX_CCH             0x8000
    

    【讨论】:

    • 但是 Windows 8 资源管理器(在我的例子中是 Win8.1 Preview)无法使用此限制,并且它不会接受超过 259 个字符的路径。
    【解决方案10】:

    我将此添加到上述批准的答案中。

    为了清楚起见,人们认为它是 255-260 个字符的原因是因为这就是 Windows Explorer 所支持的全部。它将错误地执行类似文件名的文件副本长于该文件的操作。但是,程序可以读取和写入更长的文件名(这就是 Explorer 首先抱怨的长度)。微软在这种情况下的“推荐修复”是在编写它的原始程序中打开文件并重命名它。

    【讨论】:

    • 我尝试使用 vim 从命令行将文件保存在文件夹层次结构的深处,绝对超过 260 多个字符,但没有成功。
    • @panny:所以 Vim 的作者当时没有注意实现长路径名。这不是 Windows 的责任,也不是 Win32 子系统的责任,也与 OP 询问的 NTFS 的 文件名长度 限制无关。
    【解决方案11】:

    199 在 Windows XP NTFS 上,我刚刚检查过。

    这不是理论,而只是在我的笔记本电脑上尝试。可能会有缓解效果,但它实际上不会让我让它变得更大。

    我想知道是否有其他设置限制了这一点?自己试试吧。

    【讨论】:

    • 在我的 XP 版本上确认了这一点,真痛苦
    • 我在 Windows XP 上做了同样的事情,只是为了咯咯笑。我达到了 200 个字符的限制。然后我刚刚创建了一个包含 255 次 w 的文件,将其删除并在 Windows 7 x64 上创建了一个同名的文件夹。现在的问题是这里的限制因素是什么:NTFS 版本、操作系统或子系统或 XP 中的 Win32 API?
    • 200 个字符的限制似乎在资源管理器中。其他程序可以创建更长的文件名。这可能是为了将用户从他/她自己那里拯救出来的故意限制。 :-)
    • 不,您(无意中)检查的是MAX_PATH 260 的限制(259 没有空终止符)。将C:\ 作为当前目录再试一次。
    • @Prof.Falken 我没有可用的 XP 来检查,我相信你的话,也许你更喜欢井字游戏?跨度>
    【解决方案12】:

    这是 257 个字符。 准确地说: NTFS 本身确实规定了几千个字符的最大文件名长度(大约 30'000 左右)。 但是,Windows 为 Path+Filename 规定了 260 的最大长度。驱动器+文件夹至少占用 3 个字符,因此您最终会得到 257 个字符。

    【讨论】:

    • 错误 - NUL 终止符是 MAX_PATH 的一部分,这使您的最大路径为 256 个字符(由于单个组件的限制为 255,您将无法创建该路径)。
    • “由于单个组件的限制为 255”,您将无法创建该错误。我们在这里谈论的是最大路径长度,而不是最大单个路径组件长度。而且“使用API​​创建目录时,指定路径不能太长,不能追加8.3文件名(即目录名不能超过MAX_PATH减12)。”
    • 这个争论之所以出现,是因为低级 api 允许创建 256 个字符的文件名,假设 256 个字符为空,但本机应用程序无法访问(隐藏)文件,所以不是一般有用。
    • @LudovicKuty:实际上 OP 是在谈论 文件名长度 限制,而不是 路径长度(是的,即使在原始版本中,我也检查过)。她/他非常具体地指的是 NTFS 限制,而不是操作系统、特定子系统或 API 或框架的限制。
    • @0xC0000022L 确实如此。我在 OP 问题中误读了它,并专注于谈论文件名长度和路径长度的 cmets。
    【解决方案13】:

    255 个字符,但完整路径也不应长于该长度。 Wikipedia 上有一张很好的表格:http://en.wikipedia.org/wiki/Filename

    【讨论】:

      【解决方案14】:

      【讨论】:

        猜你喜欢
        • 2011-06-05
        • 1970-01-01
        • 2011-08-31
        • 1970-01-01
        • 2012-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多