[英]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);
}
}
瞧,扫描没有递归。
伪代码(无任何尝试捕获):
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;
}
您对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.