Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么System.IO.Path.GetFullPath()抛出包含260个字符的异常?_.net_.net 4.0 - Fatal编程技术网

.net 为什么System.IO.Path.GetFullPath()抛出包含260个字符的异常?

.net 为什么System.IO.Path.GetFullPath()抛出包含260个字符的异常?,.net,.net-4.0,.net,.net 4.0,在项目中,我们通过使用一些路径traveral(\..)来找到文件的正确位置,从而创建文件的路径。此文件的具体完整路径始终低于260个字符的标记。现在我们有一个例外,如果遍历路径正好是260个字符,但如果它更长,则不例外 为了向你们展示这个问题,我做了一个小测试,抛出了一个我无法解释的异常,有什么想法吗 string root = "c:\\fold"; string subfolder = "\\aFolder"; string traversal = "\\.."; // creates

在项目中,我们通过使用一些路径traveral(
\..
)来找到文件的正确位置,从而创建文件的路径。此文件的具体完整路径始终低于260个字符的标记。现在我们有一个例外,如果遍历路径正好是260个字符,但如果它更长,则不例外

为了向你们展示这个问题,我做了一个小测试,抛出了一个我无法解释的异常,有什么想法吗

string root = "c:\\fold";
string subfolder = "\\aFolder";
string traversal = "\\..";

// creates the string ""c:\\fold\\aFolder\\..\\aFolder\\.." ... with length 249
var pathShorterThen260 = root + Enumerable.Repeat(subfolder + traversal, 22).Aggregate((first, second) => first + second);

// Works without any problem and returns "c:\fold"
var exactPath1 = Path.GetFullPath(pathShorterThen260);

// creates the string ""c:\\fold\\aFolder\\..\\aFolder\\.." ... with length 271
var pathGreaterThen260 = root + Enumerable.Repeat(subfolder + traversal, 24).Aggregate((first, second) => first + second);

// Works without any problem and returns "c:\fold"
var exactPath2 = Path.GetFullPath(pathGreaterThen260);

// creates the string ""c:\\fold\\aFolder\\..\\aFolder\\.." ... with length 260
var pathEqualTo260 = root + Enumerable.Repeat(subfolder + traversal, 23).Aggregate((first, second) => first + second);

// Throws PathTooLongException, why?
var exactPath3 = Path.GetFullPath(pathEqualTo260);

您已超过windows中的最大路径长度

在Windows API中(以下段落讨论了一些例外情况),路径的最大长度为MAX_path, 定义为260个字符

我想这是一个?从文档中,当

指定的路径、文件名或两者都超过了系统定义的最大长度。例如,在基于Windows的平台上,路径必须少于248个字符,文件名必须少于260个字符


微软已经确认了该漏洞,并已关闭


有关更多信息,请查看。

我认为256之后,您的windows超过了MAXPATH。只是一个想法,但奇怪的是260,只有260。这是.NET4特有的行为,在早期版本中,它会在两个长字符串上爆炸。重写了Path.NormalizePath()方法,该算法很难进行反向工程。将这篇文章发布到connect.microsoft.com,以获得编写代码的人的意见。但是为什么它会以260个字符的数量爆炸,并且使用超过260个字符而不会产生任何问题呢?@Oliver您可以对Passant在另一条评论中提到的
Path.NormalizePath()
运行reflector。快速搜索它会显示4个可以抛出
PathToLongException
的位置。但是,当异常超过260个字符并且只有260个字符时,为什么不抛出异常呢?