0

我正在使用 C# 4.5,并且正在尝试扫描文件共享中的所有文件夹。我想跳过我无法访问的任何文件夹并继续。我所做的是递归地执行它,这会引发 stackoverflow。我明白为什么会这样。所以我的问题是:有什么解决方法吗?

既然我们不能使用递归搜索,你将如何实现这一点?我可以使用任何第三方库来简化此操作吗?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. 列出您需要做的目录(待办事项列表)。
  2. 最初,将单个目录(在共享上)添加到待办事项列表中。
  3. 从列表中取出第一个目录并扫描它。
  4. 扫描目录时,将所有子目录添加到待办事项列表(在列表末尾)。
  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 回答