2012-03-02 9 views
1

プロジェクト内では、ファイルの正しい場所を見つけるために、いくつかのパス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); 
+0

256の後、私は思うのWindowsのMAXPATHを超えています。ちょっと考えましたが、約260と260だけが変です。http://support.microsoft.com/kb/177665 – kenny

+1

これは.NET 4固有の動作で、以前のバージョンの両方の長い文字列に適用されます。 Path.NormalizePath()メソッドが書き換えられ、アルゴリズムがリバースエンジニアリングするのは難しいです。このコードをconnect.microsoft.comに投稿して、コードを書いた人の意見を得てください。 –

答えて

1

マイクロソフトは、このバグを確認しています。.Net 4.5で閉じています。

詳細については、Microsoft Connectをご覧ください。

1

Windowsの最大パスの長さを超えました。 (次の段落で説明したいくつかの例外を除いて)は、Windows APIで

、パスの最大長は260の文字として定義されるMAX_PATH、 あります。

http://msdn.microsoft.com/en-us/library/aa365247.aspx

+0

しかし、なぜそれは正確に260で爆破し、何よりも面倒なく260の文字で動作しますか? – Oliver

+0

@Oliver Passantが別のコメントで述べた 'Path.NormalizePath()'に対してリフレクタを実行することができます。クイック検索では、PathToLongExceptionがスローされる可能性がある4つの場所が表示されます。 – asawyer

0

私はそれがPathTooLongExceptionだと仮定?

「指定したパス、ファイル名、またはその両方がシステム定義の最大長を超えたときに... Path.GetFullPath methodドキュメントから、PathTooLongExceptionがスローされます。たとえば、Windowsベースのプラットフォームでは、パスは以下でなければなりません248文字より大きく、ファイル名は260文字より小さくする必要があります。

+0

しかし、260文字以上の文字があり、正確に260文字しか含まれていないと、例外がスローされないのはなぜですか? – Oliver

関連する問題