以递归方式扫描深层目录

时间:2012-12-12 09:55:25

标签: c# recursion directory stack-overflow .net-4.5

我正在使用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);
   }
}

3 个答案:

答案 0 :(得分:1)

  1. 列出您需要执行的目录(待办事项列表)。
  2. 最初,将单个目录(在共享上)添加到待办事项列表。
  3. 从列表中取出第一个目录并进行扫描。
  4. 扫描目录时,将所有子目录添加到待办事项列表(位于列表末尾)。
  5. 返回3,直到待办事项清单为空。
  6. Voila,没有递归扫描。

    伪代码(没有任何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;
    }
    

答案 1 :(得分:0)

您可以通过ACL of the Directory检查您是否有权访问该文件夹,而不是处理异常。

答案 2 :(得分:0)

您对GetFoldersFromFS()的递归调用是错误的。它不断传递相同的文件夹到递归调用!

此外,您不应该调用Directory.SetCurrentDirectory()或GetCurrentDirectory()。

相反,在递归调用时只需执行:GetFoldersFromFS(directory):

   foreach (var directory in Directory.EnumerateDirectories(filePath))
   {
       Resources.Add(GetFolder(new DirectoryInfo(directory)));
       GetFoldersFromFS(directory);
   }