ディレクトリツリーのファイルを列挙するために.Net 4.0でDirectoryInfoとFileInfoを使用していますが、PathTooLongExceptionが発生しています。簡体字版がPathTooLongExceptionからパス情報を取得する
public static class Test
{
public static void Search(DirectoryInfo base)
{
foreach(var file in base.GetFiles())
{
try
{
Console.WriteLine(file.FullName);
} catch(PathTooLongException ex)
{
// What path was this?
}
}
foreach(var dir in base.GetDirectories())
{
Search(dir);
}
}
}
の下にエラーがスローされたとき、私は、問題の原因を、ファイルのパスを知りたいです。明らかに私は
FullName
を尋ねることができません。私は
file.Name
から名前を得ることができますが、私が
file.Directory
が
PathTooLongException
を与えたとして、残りのパスを得ることができない場合は、
DirectoryInfo
というファイルが正常に動作していることがわかりました! (私は実際のコードがはるかに複雑なので、私はそれを使用することはできません)。
スタックトレースを見ると、内部パス(私はデバッグから保護されたfile.FullPath
が表示されています)を使用していて、フル(大型)パスからディレクトリを破棄しようとしています。ほとんどの問題にはSystem.IO.Path.NormalizePath
が含まれているようですが、.Net 4.0のいくつかの変更が行われたと聞きました。私はフレームワークの以前のバージョンで試していません。
私の質問:私はこの例外からの完全なパスを取得できますか
- 。それは一見有益な情報なしで渡されます。
- なぜフレームワークはファイル名を切り落とすためにパス内の文字を制限する必要がありますか?任意の助けを事前に
おかげで、
アンディ
ありがとうクリストファー、私はこれが事実であると思った。それは私のために無効なパスを作成したにもかかわらず、プライベートにパスを保持し、最初にそれを検証せずにアクセスを許可しないようにちょうど愚かなようです。 あなたが指している 'LongPath'ライブラリはすばらしく見えます!残念ながら私はすべてのパスがUNCになるので、(まだ)そのまま使用することはできません。直接APIを実装する方法を見ても、コードを調べると非常に便利です。 – Andyrooger
@Andyrooger、ええ、私はそれについて忘れました。コードをフォークしてしばらく前に追加しました。あなたはコードを入手することができます[そのcodeplexプロジェクトで](http://longpaths.codeplex.com/)。リリースではなくソースコードを使用して、私はばかなバグを修正しました。 –
@ChristopherCurrens +1のFieldInfoヒント! –