2011-10-13 7 views
5

以下のコードを使用してコンピュータ上のファイルを列挙しようとしていますが、それを読み取る権限のないファイルまたはディレクトリにヒットするたびに、例外がスローされます。例外がスローされた後でも検索を続ける方法はありますか?私は、似たような問題を抱えている人がいることは知っていますが、ファイル/フォルダを個別にチェックする以外の方法はありますか?ファイルの列挙例外

try 
{ 
string[] files = Directory.GetFiles(@"C:\", "*.*",SearchOption.AllDirectories); 
foreach (string file in files) 
{ 
    Console.WriteLine(file); 
} 
} 
catch 
{ 
} 

これが私を怒らせるように助けてくれてありがとう!

答えて

10

今日は同じ問題が発生しました。私は次のコードを一緒にハッキングしました。実際の製品で使用する場合は、エラー処理を改善する必要があります。これはワンショットスクリプトのためであり、私はあまり気にしなかった。

static IEnumerable<string> EnumerateFilesRecursive(string root,string pattern="*") 
{ 
    var todo = new Queue<string>(); 
    todo.Enqueue(root); 
    while (todo.Count > 0) 
    { 
     string dir = todo.Dequeue(); 
     string[] subdirs = new string[0]; 
     string[] files = new string[0]; 
     try 
     { 
      subdirs = Directory.GetDirectories(dir); 
      files = Directory.GetFiles(dir, pattern); 
     } 
     catch (IOException) 
     { 
     } 
     catch (System.UnauthorizedAccessException) 
     { 
     } 

     foreach (string subdir in subdirs) 
     { 
      todo.Enqueue(subdir); 
     } 
     foreach (string filename in files) 
     { 
      yield return filename; 
     } 
    } 
} 

あなたがいずれかのことができ、それを使用するには:最初のメモリ内のすべてのファイル、店舗すべてのファイル名を列挙し、だけにして、それらを表示する

string[] files = EnumerateFilesRecursive(@"C:\").ToArray();//Note the ToArray() 
foreach (string file in files) 
{ 
    Console.WriteLine(file); 
} 

を。または、次のように指定することもできます。

列挙中に書き込みを行うため、すべてのファイル名を同時にメモリに保存する必要はありません。

+0

あなたのコードを共有していただきありがとうございます。私はそれを動作させる方法を解決することはできません、私はC#で非常に経験はありません。私は、文字列のルートと文字列パターンがargsになると仮定してメソッドを呼び出そうとしましたが、幸運にも、私はConsole.WriteLine()でコンソールに出力したいだけです。ありがとう! –

+0

私はあなたに+100を与えることができたらいいなあ!それは完璧に働いた、ありがとう! –

関連する問題