请确认.NET 4.0中路径长度相关行为的更改

Cub*_*cle 4 .net c# .net-4.0

有人可以确认微软改变了.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上提交了一份报告.你可以在这里找到它.

Han*_*ant 5

编辑我的答案,原来的不正确.是的,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的行为是完全正确的.