有人可以确认微软改变了.NET 4.0中System.IO的某些classe的路径长度相关行为吗?例如,下面的代码在.NET 3.5上运行正常但在4.0上为我抛出了PathTooLongException.
const string prefix = "C:\\";
const string suffix = ".txt";
var sb = new StringBuilder();
sb.Append(prefix);
for (var i = 0; i < 260 - prefix.Length - suffix.Length - 1; i++)
{
sb.Append("a");
}
sb.Append(suffix);
var info = new FileInfo(sb.ToString());
Run Code Online (Sandbox Code Playgroud)
此外,调用File.Create(sb.ToString())在.NET 3.5上抛出IOException但在.NET 4.0上抛出PathTooLongException.可能会有更多差异.
这些变化是否记录在某处?
谢谢!
[编辑]
我按照Hans Passant的建议,并在connect.microsoft.com上提交了一份报告.你可以在这里找到它.
编辑我的答案,原来的不正确.是的,Path.NormalizePath()方法经历了.NET 4.0中的一些重大更改.我设法使用Reference Source调试了这个,并在源代码中找到了一个解释其行为的注释:
// The max total path is 260, and the max individual component length is 255.
// For example, D:\<256 char file name> isn't legal, even though it's under 260 chars.
internal static readonly int MaxPath = 260;
private static readonly int MaxDirectoryLength = 255;
...
if (newBuffer.Length - 1 - lastDirectorySeparatorPos > MaxDirectoryLength)
{
throw new PathTooLongException(Environment.GetResourceString("IO.PathTooLong"));
}
Run Code Online (Sandbox Code Playgroud)
这是您的代码触发的异常.它看起来很棘手,因为代码似乎检查目录名长度,这显然不会接近代码中的255个字符.但是,注释解释了为什么您的路径被拒绝,路径的文件名部分是259-3 = 256个字符.一个太多了.
我以前没有意识到这个限制,并且有点怀疑所有版本的Windows都有此限制.我所看到的所有文件都记录了目录名称的最大长度(路径减去文件名).代码中还有其他注释表明Windows 2000中存在一个可能与其有关的错误.
Anyhoo,你可以通过改变自己看到这个
const string prefix = "C:\\a\\";
Run Code Online (Sandbox Code Playgroud)
现在接受了259个字符的路径字符串.换句话说,如果路径名称引用了驱动器根文件夹,则此行为应该只是字节.不是您应该存储文件的地方.
鉴于源代码中的注释,此更改是非常有意的,应该被视为一个功能,而不是错误.不过,我在您开始的反馈文章中发表了评论.我还没有完全买它......
更新:好的我已经卖掉了.我尝试在Win7上使用C++创建这样的文件,但它失败了.根目录中的文件确实不能有超过258个字符的路径名.限制似乎是由路径的一个组件(子目录名称,文件名)引起的,不允许超过255个字符..NET 4.0的行为是完全正确的.
| 归档时间: |
|
| 查看次数: |
560 次 |
| 最近记录: |