22

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

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

4

2 回答 2

43

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

最大字符数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 对您施加的限制。这不是真正的限制(见第一段)。

作为 .NET 的旁白

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 上的更新条目中,标题为“最大路径长度限制”的部分。

于 2010-08-04T14:29:06.840 回答
-1

如果您在路径前加上\\?. 请参阅MSDN 上的以下命名文件、路径和命名空间。

于 2010-08-04T14:39:04.040 回答