プロジェクト内では、ファイルの正しい場所を見つけるために、いくつかのパスtraveral(\..
)を使用してファイルへのパスを作成します。このファイルへの具体的なフルパスは常に260文字以下です。トラバーサルパスが正確に260文字であれば例外がありましたが、長い場合は例外ではありませんでした。なぜSystem.IO.Path.GetFullPath()は正確な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);
256の後、私は思うのWindowsのMAXPATHを超えています。ちょっと考えましたが、約260と260だけが変です。http://support.microsoft.com/kb/177665 – kenny
これは.NET 4固有の動作で、以前のバージョンの両方の長い文字列に適用されます。 Path.NormalizePath()メソッドが書き換えられ、アルゴリズムがリバースエンジニアリングするのは難しいです。このコードをconnect.microsoft.comに投稿して、コードを書いた人の意見を得てください。 –