NTFS文件系统(Windows XP和Windows Vista)中的最大文件名长度是多少?

286

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


92
我从来没有见过这么多不同的答案,对于一个本应简单的问题。199、255、256、257、260、约30,000、大约32,000、以及“取决于情况”。当然,这些都有条件限制,但它们能够全都是正确的吗? - MickeyfAgain_BeforeExitOfSO
7
我知道它的值是255,因为我不得不开发一个应用程序来阻止企业用户访问它,因为这会导致我们的存储服务器出现问题。 - RobertPitt
3
@RobertPitt。你在那里缺少了一些东西。引用MSDN的话:“路径的最大长度为MAX_PATH,定义为260个字符”。 - Michael Olesen
7
@Michael9000。我相信RobertPitt是在引用文件名长度限制(这也是这个问题的讨论点),而不是路径限制。 - gdw2
9
NTFS并不受MAX_PATH限制,Windows Shell受到限制,NTFS最大路径长度为32k。 - paulm
显示剩余4条评论
15个回答

311

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

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


4
以下是一些进一步证实这个答案的事实(Windows 通常限制路径长度为 260 个字符):http://msdn.microsoft.com/en-us/library/system.io.PathTooLongException.aspx 和 http://blogs.msdn.com/b/bclteam/archive/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx。 - Michael Olesen
65
根据您提供的链接,对于NTFS文件系统是正确的,但对于Windows操作系统并非如此:“在Windows API中(有一些例外情况在下文中讨论),路径的最大长度为MAX_PATH,定义为260个字符”。对于所有实际目的,路径长度限制为259个字符(包括空终止符)。 - Lawrence Dol
9
显然,如果你使用Windows API文件方法的“unicode版本”,并在路径名前加上“\?\”,那么你可以获得最多32767个字符,这是正确的吗? - rogerdpack
7
针对完整路径来说,是的,但每个单独的组成部分(子文件夹/最终文件)有一个255个UTF-16代码点的限制。此外,通常的软件期望MAX_PATH,所以就会发生错误。 - snemarch
6
在Windows 10(1607版本-周年更新)和Windows Server 2016中,您似乎可以通过在计算机配置->管理模板->系统->文件系统下覆盖组策略条目启用NTFS长路径的选项来忽略MAX_PATH问题。 - Steven Mark Ford
显示剩余8条评论

31

这段内容共有257个字符。详细来说,NTFS本身对文件名长度有最大限制,约为数千个字符(大约30,000多个字符)。但是,Windows对路径和文件名的最大长度设置为260个字符。驱动器和文件夹名称至少需要占用3个字符,因此您最终只能使用257个字符。


22
错误 - NUL 终止符是 MAX_PATH 的一部分,这使得最大路径长度为 256 个字符(由于每个组件的限制为 255,您将无法创建这么长的路径)。 - snemarch
4
“你因为单个组件长度限制为255而无法创建的内容”是错误的。我们在讨论最大路径长度,而不是单个路径组件的最大长度。此外,“当使用API创建目录时,指定的路径长度不能太长,以至于您无法附加8.3文件名(也就是说,目录名不能超过 MAX_PATH 减去 12 )。” - Ludovic Kuty
这场辩论的起因是低级API允许创建256个字符的文件名,假设256个字符是空值,但该文件对本地应用程序不可访问(隐藏),因此通常没有用。 - user337598
4
@LudovicKuty说:“实际上”,原帖讨论的是文件名长度限制,而不是路径长度(是的,即使在原始版本中,我也进行了检查)。而且,他/她非常明确地提到了NTFS的限制,而不是操作系统、特定子系统、API或框架的限制。 - 0xC0000022L
@0xC0000022L 是的,确实如此。我在 OP 的问题中误读了它,并关注了评论,其中谈到了文件名长度和路径长度。 - Ludovic Kuty

30

当尝试保存一个文件名很长的文件时,.NET Framework 4.5会显示"未处理的异常"错误信息:

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

screenshot


15

在NTFS中,文件名长度为255。NTFS的$Filename属性中的NameLength字段是一个没有偏移量的字节;这使得它的取值范围为0-255。

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

因此,文件或目录的名称最多可以有255个字符。在Windows下指定完整路径时,需要在路径前加上\\?\(或对于UNC路径,请使用\\?\UNC\server\share)来将此路径标记为扩展长度路径(约32k个字符)。如果您的路径太长,则必须沿途设置工作目录(哎呀——由于进程范围设置而产生的副作用)。



15

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

这不是理论,而是从我的笔记本电脑尝试得出的结果。可能会有一些缓解效果,但它物理上不会让我把它变大。

我想是否有其他限制此功能的设置?请自行尝试。


1
我在我的XP版本上确认了这一点,真是太痛苦了。 - Julian Young
2
200个字符的限制似乎只存在于资源管理器中。其他程序可以创建更长的文件名。这可能是一种有意的限制,以避免用户自己给自己带来麻烦。 :-) - avl_sweden
1
@Prof.Falken,我已经没有可用的XP进行检查,所以我会相信您的话,也许你想玩一局井字游戏? - dove
@dove 你想来一局好玩的国际象棋吗? - Prof. Falken
@Prof.Falken Bf4 - dove
显示剩余7条评论

13

根据MSDN,文件路径的最大长度为260个字符。这个长度包括了不可见的终止空字符"<NUL>",所以实际长度是259个字符。

但文章指出,情况还要更加复杂。


1
实际上,引用的MSDN文章指出,路径限制为260个字符,但文件名的长度取决于文件系统(通常为255字节)。然而,可以使用“Unicode版本[Windows API函数]”将路径限制提高到32767字节,但该限制在运行时由Windows内部扩展所需的\\?\前缀而被减少到某个未指定的长度。此扩展后的路径长度必须在32767字节以下。 - Mikko Rantalainen


5

我在以上批准的答案中添加了这个。

需要明确的是,人们认为255-260个字符是因为Windows Explorer只支持这么长的文件名。如果文件名超过这个长度,它会在执行文件复制等操作时出错。然而,程序可以读写更长的文件名(这也是你首先看到Explorer抱怨文件名太长的原因)。微软在这种情况下的“推荐解决方案”是打开编写该文件的原始程序并将其重命名。


我尝试使用vim命令行将一个深层文件夹层次结构中超过260个字符的文件保存下来,但是没有成功。 - panny
1
@panny:所以Vim的作者并没有考虑实现长路径名,这不是Windows或Win32子系统的问题,也与NTFS的文件名长度限制无关,这是OP询问的。 - 0xC0000022L

4

官方文档清楚地说明了,对于NTFS、exFAT和FAT32文件系统,文件名最多使用255个Unicode字符,而对于UDF文件系统,则为127个Unicode字符或254个ASCII字符。

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


足够接近。正如我在被接受的答案的评论中指出的那样,它是32767个WCHAR元素。不,这不是“Unicode字符”(检查你的Unicode术语:代码点、字符等等……!)。 - 0xC0000022L

3
根据新的Windows SDK文档(8.0),似乎提供了一种新的路径限制。有一组新的路径处理函数和PATHCCH_MAX_CCH的定义如下:
// max # of characters we support using the "\\?\" syntax
// (0x7FFF + 1 for NULL terminator)
#define PATHCCH_MAX_CCH             0x8000

4
然而,Windows 8资源管理器(在我的情况下为Win8.1预览版)无法处理此限制,并且不接受超过259个字符的路径。 - user1798386

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接