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

时间:2010-08-04 14:27:09

标签: c# .net base-class-library

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

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

2 个答案:

答案 0 :(得分:38)

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

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

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

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

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


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

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

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

暂不论.NET

Microsoft has confirmed that it is a problem以及.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实现使用的最大路径。对于最大目录大小Path.MAX_DIRECTORY_PATH,BCL中有一个不同的值,但即使在BCL内部也不会使用它。如果您创建的目录等于此大小,则无法在该目录中放置任何文件。更糟糕的是,只是打开它会引发错误(因为强制的半目录别名...,导致许多API崩溃)。


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

  

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

     

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

更多信息位于updated entry on MSDN,大约一半。

答案 1 :(得分:-1)

如果使用\\?前置路径,则可以使UNC路径长于260。请参阅MSDN上的以下Naming Files, Paths and Namespaces