使用 C# 时,目录的典型路径可以包含的最大字符数是多少?
例如C:\test\
长度为 7 个字符,最大长度是多少?
最大字符数MAX_PATH
在 Win32 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 版本 1607 起,此限制已被删除,详情请参见下文。
作为一般建议,您不应依赖这些数字中的任何一个。相反,如果您想通知用户路径太长,请捕获 PathTooLongException:
try
{
SetCurrentDirectory(longPath);
}
catch(PathTooLongException exc)
{
Console.WriteLine("The pathname was too long");
}
注意:当您超过 260 个字符时,上面的代码将抛出,这是 CLR 对您施加的限制。这不是真正的限制(见第一段)。
Microsoft已确认当前的 .NET 实现存在问题,您无法可靠地找出 CLR 支持的最大路径大小。如果您想以编程方式获取此信息,请使用该Path.MaxPath
属性。但是,该属性internal
意味着您只能通过反射访问它,并且您不能保证它可以跨版本或其他 BCL 实现(单声道)工作:
// 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 开始,MAX_PATH 限制已从常见的 Win32 文件和目录函数中删除。但是,您必须选择加入新行为。
注册表项允许您启用或禁用新的长路径行为。要启用长路径行为,请将注册表项设置为
HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled
(类型:REG_DWORD)。
更多信息在 MSDN 上的更新条目中,标题为“最大路径长度限制”的部分。
如果您在路径前加上\\?
. 请参阅MSDN 上的以下命名文件、路径和命名空间。