我正在使用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);
}
}
答案 0 :(得分:1)
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);
}