繁体   English   中英

递归扫描深目录

[英]Scan deep directories recursively

我正在使用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);
   }
}
  1. 列出您需要执行的目录(待办事项列表)。
  2. 最初,将单个目录(在共享上)添加到待办事项列表。
  3. 从列表中获取第一个目录并进行扫描。
  4. 扫描目录时,请将所有子目录添加到待办事项列表中(在列表末尾)。
  5. 返回3直到待办事项列表为空。

瞧,扫描没有递归。

伪代码(无任何尝试捕获):

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;
}

除了处理异常之外,您还可以检查您是否有权通过目录ACL访问该文件夹。

您对GetFoldersFromFS()的递归调用是错误的。 它一直将相同的文件夹传递给递归调用!

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

而是,在您的递归调用处执行:GetFoldersFromFS(directory):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM