使用C#时,典型路径可以包含的最大字符数是多少?
例如C:\test\
长度为7个字符,最大长度是多少?
答案 0 :(得分:38)
最大字符数由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对您施加的限制。这不是真正的限制(见第一段)。
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。