ped*_*ram 21 .net c# base-class-library
使用C#时,典型路径可以包含的最大字符数是多少?
例如C:\test\,长度为7个字符,最大长度是多少?
Abe*_*bel 39
最大字符数由MAX_PATHWin32 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,build 1607以来,此限制已被删除,请参阅下面的详细信息.
作为一般性建议,您不应该依赖任何这些数字.相反,如果要通知用户路径太长,请捕获PathTooLongException:
try
{
SetCurrentDirectory(longPath);
}
catch(PathTooLongException exc)
{
Console.WriteLine("The pathname was too long");
}
Run Code Online (Sandbox Code Playgroud)
注意:当您超过260个字符时,上面的代码将抛出,这是CLR对您施加的限制.这不是真正的限制(见第一段).
Microsoft 已经确认,当前的.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);
Run Code Online (Sandbox Code Playgroud)
注意:这为您提供了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(Type:REG_DWORD).
| 归档时间: |
|
| 查看次数: |
16770 次 |
| 最近记录: |