一个目录的最大字符数或长度是多少?

24

当使用C#时,目录中典型路径所能包含的最大字符数是多少?

例如C:\test\的长度为7个字符,那么最大长度是多少?


2
在C#中?还是在特定操作系统上?两者都不同。你需要澄清你的问题。 - CaffGeek
C# 是独立于操作系统的。也就是说,它可以在 Linux、Windows、x86、x64、移动设备等各种平台上运行。每个平台都有不同的最大限制。使用我所描述的方法并捕获异常,这通常是你应该做的最好的事情。 - Abel
2个回答

47

CLR中MaxPath的最大长度为260个字符

最大字符数由Win32 API库中的MAX_PATH定义。此设置为260,该设置硬编码在CLR BCL内部。达到该字符数的路径可能会导致问题(请参见下面的说明)。这个最大值是旧的FAT和FAT32的最大值。

相反,NTFS文件系统默认用于大多数Windows安装,其最大值为32767个字符,并支持Unicode(在每个字符占用2个字节的实现中,即UCS-2,而不是UTF-32)。但即使在NTFS中,单个路径段也不能超过255个字符。尽管NTFS支持非常长的文件名,但大多数应用程序,包括任何依赖于System.IO的.NET应用程序,都无法看到这些文件名。

为什么是260而不是256?因为驱动器指定符、第一个反斜杠和结尾的空字符不属于长度限制的一部分。您可以使用GetVolumeInformation获取Windows的此信息,应为每个卷查询此信息(每个卷可以具有不同的最大大小)。

我假设是Windows。Linux和其他操作系统可能会有所不同。自Windows 10,build 1607以来,此限制已被删除,请参见下面的详细信息。


作为一般建议,您不应依赖于这些数字。相反,如果您想通知用户路径太长,请捕获PathTooLongException:
try
{
    SetCurrentDirectory(longPath);
}
catch(PathTooLongException exc)
{
    Console.WriteLine("The pathname was too long");
}

注意:上面的代码将在超过260个字符时抛出异常,这是CLR对您施加的限制。这并不是真正的限制(请参见第一段)。
关于.NET的旁注:
微软已确认,当前实现的.NET存在问题,您无法可靠地找出CLR支持的最大路径大小。如果要以编程方式获取此信息,请使用Path.MaxPath属性。但是,该属性为internal,这意味着您只能通过反射访问它,并且不能保证它将在其他版本或BCL实现(Mono)上工作:
// reflection
FieldInfo maxPathField = typeof(Path).GetField("MaxPath", 
    BindingFlags.Static | 
    BindingFlags.GetField | 
    BindingFlags.NonPublic );

// invoke the field gettor, which returns 260
int MaxPathLength = (int) maxPathField.GetValue(null);

注意:这提供的是 Microsoft 的 .NET 实现中使用的最大路径。在 BCL 中有一个不同的值用于最大目录大小,即 Path.MAX_DIRECTORY_PATH,但即使在 BCL 中也从未使用过这个值。如果您创建了一个与此大小相等的目录,则无法在该目录中放置任何文件。更糟糕的是,仅打开它就会引发错误(因为强制性的半目录别名“.”和“..”,这会导致许多 API 崩溃)。

更新:从Windows 10 Build 1607开始,您可以通过注册表中的OptIn来移除限制:

自Windows 10版本1607起,常见的Win32文件和目录函数已经删除了MAX_PATH限制。但是,您必须选择新行为。

一个注册表键允许您启用或禁用新的长路径行为。要启用长路径行为,请设置注册表键为 HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (类型:REG_DWORD)。

更多信息请参见MSDN上更新的条目,标题为“最大路径长度限制”。


2
引用的限制是NTFS,而不是Windows。FAT(通常用于各种可移动驱动器)的限制仍为260。这就是为什么您可以从GetVolumeInformation()获取它 - 它是格式和卷相关的。 - MSalters
@MSalters:是的,完全正确。我会进行更新以便更清晰地表达这个区别。 - Abel
重写了大部分代码,并添加了一个获取真实 MaxPath 属性的方法。 - Abel
2
MAX_PATH 包括 "<NUL>",它代表不可见的终止空字符。因此实际最大长度为259,而不是260。请参阅 https://msdn.microsoft.com/en-us/library/aa365247.aspx#maxpath - Michael Freidgeim

0

12
这在 C#/.NET 中不起作用。(“目前,.NET 不允许您使用 \?\ 前缀。”详见 http://blogs.msdn.com/b/bclteam/archive/2008/07/07/long-paths-in-net-part-3-of-3-redux-kim-hamilton.aspx。) - Mark Meuer

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