0

私は C# 4.5 を使用しており、すべてのフォルダーのファイル共有をスキャンしようとしています。アクセスできないフォルダをスキップして続行したい。私が行ったことは、再帰的に行うことです。これにより、スタックオーバーフローがスローされます。なぜこれが起こるのか理解しています。だから私の質問は: 回避策はありますか?

再帰検索を使用できないため、これをどのように実装しますか? これを簡素化するために使用できるサードパーティのライブラリはありますか? GetFolder関数は一部の情報のみを抽出し、カスタム クラスを返します。これは正常に機能します。

public void GetFoldersFromFS(string filePath)
{
   if (filePath == null)
   {
      return;
   }

   Directory.SetCurrentDirectory(filePath);
   try
   {
       foreach (var directory in Directory.EnumerateDirectories(Directory.GetCurrentDirectory()))
       {
           Resources.Add(GetFolder(new DirectoryInfo(directory)));
           GetFoldersFromFS(directory);
       }
   }
   catch (UnauthorizedAccessException e)
   {
      Log.Warn(e.Message);
   }
   catch (PathTooLongException e)
   {
      Log.Warn(e.Message);
   }
}
4

3 に答える 3

1
  1. 必要なディレクトリのリストを作成します (to-do リスト)。
  2. 最初に、単一のディレクトリ (共有上) を to-do リストに追加します。
  3. リストから最初のディレクトリを取得してスキャンします。
  4. ディレクトリをスキャンするときは、サブディレクトリを to-do リスト (リストの最後) に追加します。
  5. やることリストが空になるまで 3 に戻ります。

ほら、再帰なしでスキャンします。

疑似コード (try-catch なし):

public List<string> ScanDirectory(string directory) {
    var toDoList = new Queue<string>();
    var result = new List<string>();
    toDoList.Enqueue(directory);

    // Keep going while there is anything to do
    while (toDoList.Count > 0) {
        // Get next directory-to-scan, and add it to the result
        var currentDir = toDoList.Dequeue();
        result.Add(currentDir);
        // Get sub directories
        var subDirectories = new DirectoryInfo(currentDir).GetDirectories();    // TODO: Add any other criteria you want to check
        // Add the sub directories to the to-do list
        foreach (var subDirectory in subDirectories) {
            toDoList.Enqueue(subDirectory);
        }
    }

    // Return all found directories
    return result;
}
于 2012-12-12T09:58:00.927 に答える
0

例外を処理する代わりに、 Directory の ACL を介してそのフォルダーにアクセスする権限があるかどうかを確認できます。

于 2012-12-12T10:03:14.137 に答える
0

GetFoldersFromFS() への再帰呼び出しが間違っています。同じフォルダを再帰呼び出しに渡し続けます!

また、Directory.SetCurrentDirectory() または GetCurrentDirectory() を呼び出さないでください。

代わりに、再帰呼び出しで次のようにします: GetFoldersFromFS(directory):

   foreach (var directory in Directory.EnumerateDirectories(filePath))
   {
       Resources.Add(GetFolder(new DirectoryInfo(directory)));
       GetFoldersFromFS(directory);
   }
于 2012-12-12T10:04:18.877 に答える