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

时间:2010-06-30 14:56:22

标签: c# .net-4.0 .net

有人可以确认微软改变了.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());

此外,对File.Create(sb.ToString())的调用会在.NET 3.5上抛出IOException,但在.NET 4.0上抛出PathTooLongException。可能会有更多不同。

这些变化是否记录在某处?

谢谢!

[编辑]

我遵循了Hans Passant的建议,并在connect.microsoft.com上提交了一份报告。您可以在here上找到它。

2 个答案:

答案 0 :(得分:5)

编辑我的答案,原始答案不正确。是的,Path.NormalizePath()方法经历了.NET 4.0中的一些重大更改。我设法通过参考源调试了这个,并在源代码中找到了一个解释其行为的注释:

    // 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")); 
        }

这是您的代码触发的异常。它看起来很棘手,因为代码似乎检查目录名长度,这显然不会接近代码中的255个字符。但是,注释解释了为什么您的路径被拒绝,路径的文件名部分是259-3 = 256个字符。太多了。

我以前没有意识到这种限制,并且有点怀疑所有版本的Windows都有此限制。我所看到的所有文件都记录了目录名称的最大长度(路径减去文件名)。代码中还有其他注释表明Windows 2000中存在一个可能与其有关的错误。

Anyhoo,您可以通过更改

自行查看
        const string prefix = "C:\\a\\";

现在接受了259个字符的路径字符串。换句话说,如果路径名称引用驱动器根文件夹,则此行为应该只是字节。不是你应该存储文件的地方。

鉴于源代码中的注释,此更改是非常有意的,应该被视为一个功能,而不是错误。不过,我在您开始的反馈文章中发表了评论。我还没有完全买到它......


更新:好的我已经卖掉了。我尝试在Win7上使用C ++创建这样的文件,但它失败了。根目录中的文件确实不能有超过258个字符的路径名。该限制似乎是由路径(子目录名称,文件名)的组件引起的,不允许超过255个字符。 .NET 4.0的行为是完全正确的。

答案 1 :(得分:0)

您是否检查了反射器中的File.Create()方法,并比较了两个版本?