当使用C#时,目录中典型路径所能包含的最大字符数是多少?
例如C:\test\
的长度为7个字符,那么最大长度是多少?
当使用C#时,目录中典型路径所能包含的最大字符数是多少?
例如C:\test\
的长度为7个字符,那么最大长度是多少?
最大字符数由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以来,此限制已被删除,请参见下面的详细信息。
try
{
SetCurrentDirectory(longPath);
}
catch(PathTooLongException exc)
{
Console.WriteLine("The pathname was too long");
}
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);
更新:从Windows 10 Build 1607开始,您可以通过注册表中的OptIn来移除限制:
自Windows 10版本1607起,常见的Win32文件和目录函数已经删除了MAX_PATH限制。但是,您必须选择新行为。
一个注册表键允许您启用或禁用新的长路径行为。要启用长路径行为,请设置注册表键为
HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled
(类型:REG_DWORD)。
更多信息请参见MSDN上更新的条目,标题为“最大路径长度限制”。
GetVolumeInformation()
获取它 - 它是格式和卷相关的。 - MSaltersMaxPath
属性的方法。 - Abel如果在路径前面加上\\?
,则可以使用长于260个字符的UNC路径。请参阅MSDN上的命名文件、路径和命名空间。