gpt4 book ai didi

c# - 请确认 .NET 4.0 中路径长度相关行为的变化

转载 作者:太空狗 更新时间:2023-10-30 01:11:12 25 4
gpt4 key购买 nike

有人可以确认微软在 .NET 4.0 中更改了 System.IO 中某些类的路径长度相关行为吗?例如,下面的代码在 .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 找到它.

最佳答案

编辑我的答案,原来的不正确。是的,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 中存在一个差一错误,这可能与此有关。

无论如何,你可以通过更改自己看到这一点

        const string prefix = "C:\\a\\";

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

鉴于源代码中的注释,此更改是有意为之的,应将其视为一项功能,而不是错误。尽管如此,我还是对您发起的反馈文章发表了评论。我还是不完全买账......


更新:好吧,我相信了。我尝试在 Win7 上使用 C++ 创建这样的文件,但失败了。根目录中的文件的路径名确实不能超过 258 个字符。该限制似乎是由路径的组成部分引起的,该路径(子目录名称、文件名称)的长度不得超过 255 个字符。 .NET 4.0 行为是完全正确的。

关于c# - 请确认 .NET 4.0 中路径长度相关行为的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3150447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com