2012-03-06 15 views
3

ディレクトリツリーのファイルを列挙するために.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.DirectoryPathTooLongExceptionを与えたとして、残りのパスを得ることができない場合は、 DirectoryInfoというファイルが正常に動作していることがわかりました! (私は実際のコードがはるかに複雑なので、私はそれを使用することはできません)。

スタックトレースを見ると、内部パス(私はデバッグから保護されたfile.FullPathが表示されています)を使用していて、フル(大型)パスからディレクトリを破棄しようとしています。ほとんどの問題にはSystem.IO.Path.NormalizePathが含まれているようですが、.Net 4.0のいくつかの変更が行われたと聞きました。私はフレームワークの以前のバージョンで試していません。

私の質問:私はこの例外からの完全なパスを取得できますか

  1. 。それは一見有益な情報なしで渡されます。
  2. なぜフレームワークはファイル名を切り落とすためにパス内の文字を制限する必要がありますか?任意の助けを事前に

おかげで、
アンディ

答えて

6
私が使用するライブラリまたはP /呼び出しをリフレクションを使用して、または使用以外の私の頭の上から、他の方法を考えることはできません

長いパスをサポートし、手動で長さをチェックするWindows API。フルパスはあなたがしようとしている場合、実際にファイルで何かを行うと、単にファイルの長さをチェックしないで、私はこの1つfrom the BCL team at Microsoftのようなライブラリを使用することをお勧めしFullPath

foreach(var dir in new DirectoryInfo (@"D:\longpaths") 
        .GetFileSystemInfos("*.*", SearchOption.AllDirectories)) 
{ 
    try 
    { 
     Console.WriteLine(dir.FullName); 
    } 
    catch (PathTooLongException) 
    { 
       FieldInfo fld = typeof(FileSystemInfo).GetField(
             "FullPath", 
             BindingFlags.Instance | 
             BindingFlags.NonPublic); 
       Console.WriteLine(fld.GetValue(dir)); // outputs your long path 
    } 
} 

と呼ばprotected stringフィールドに格納されていますただし、DirectoryInfosFileInfoまたはFileSystemInfoという文字列は作成されません。だからあなたのコードの代わりにドロップインではないかもしれません。

2番目の質問に対する答えは、this blog postという長いパスを.NETで処理することをお勧めします。これは、.NETで長いパスサポートを追加していない理由を説明する引用です。

32Kの制限についてご迷惑をおかけする人はほとんどいないので、問題は解決しましたか?まあまあ。過去に長いパスを追加することに消極的だった理由がいくつかあります。なぜなら、セキュリティ、Windows APIの\\ \構文の矛盾したサポート、およびアプリケーションの互換性に関連して、まだ注意を払っています。

3部構成のシリーズで、APIがその方法である理由とその理由がいくつか説明されています。

+0

ありがとうクリストファー、私はこれが事実であると思った。それは私のために無効なパスを作成したにもかかわらず、プライベートにパスを保持し、最初にそれを検証せずにアクセスを許可しないようにちょうど愚かなようです。 あなたが指している 'LongPath'ライブラリはすばらしく見えます!残念ながら私はすべてのパスがUNCになるので、(まだ)そのまま使用することはできません。直接APIを実装する方法を見ても、コードを調べると非常に便利です。 – Andyrooger

+0

@Andyrooger、ええ、私はそれについて忘れました。コードをフォークしてしばらく前に追加しました。あなたはコードを入手することができます[そのcodeplexプロジェクトで](http://longpaths.codeplex.com/)。リリースではなくソースコードを使用して、私はばかなバグを修正しました。 –

+0

@ChristopherCurrens +1のFieldInfoヒント! –

関連する問題