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

ped*_*ram 21 .net c# base-class-library

使用C#时,典型路径可以包含的最大字符数是多少?

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

Abe*_*bel 39

CLR中MaxPath的最大值为260个字符

最大字符数由MAX_PATHWin32 API库中定义.此设置为260,并且在CLR BCL内使用硬编码的相同设置.达到该字符数量的路径可能会造成麻烦(参见下文).这个最大值是旧的FAT和FAT32的最大值.

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

为什么260而不是256?因为驱动器说明符,第一个反斜杠和尾随空终止字符不是长度限制的一部分.您可以使用Windows获取此信息GetVolumeInformation,您应该单独查询每个卷(每个卷可以具有不同的最大大小).

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


作为一般性建议,您不应该依赖任何这些数字.相反,如果要通知用户路径太长,请捕获PathTooLongException:

try
{
    SetCurrentDirectory(longPath);
}
catch(PathTooLongException exc)
{
    Console.WriteLine("The pathname was too long");
}
Run Code Online (Sandbox Code Playgroud)

注意:当您超过260个字符时,上面的代码将抛出,这是CLR对您施加的限制.这不是真正的限制(见第一段).

作为.NET的一小部分

Microsoft 已经确认,当前的.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);
Run Code Online (Sandbox Code Playgroud)

注意:这为您提供了Microsoft .NET实现使用的最大路径.对于最大目录大小Path.MAX_DIRECTORY_PATH,BCL中有一个不同的值,但即使在BCL内部也不会使用它.如果您创建的目录等于此大小,则无法在该目录中放置任何文件.更糟的是,刚刚开场就抛出一个错误(因为强制半目录别名...,这导致许多API的死机).


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

从Windows 10版本1607开始,MAX_PATH限制已从常见的Win32文件和目录函数中删除.但是,您必须选择加入新行为.

注册表项允许您启用或禁用新的长路径行为.要启用长路径行为,请将注册表项设置为 HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type:REG_DWORD).

更多信息在MSDN上更新条目中,大约一半.

  • 引用的限制是NTFS,而不是Windows.FAT的限制(通常用于所有亲戚的可移动驱动器上)仍然是260.这就是为什么你从`GetVolumeInformation()`得到它 - 它的格式 - 因此与体积有关. (2认同)
  • MAX_PATH包含"<NUL>",表示不可见的终止空字符.所以实际最大长度是259,而不是260.请参阅https://msdn.microsoft.com/en-us/library/aa365247.aspx#maxpath (2认同)