在.NET 4中,这种带有递归的Directory.EnumerateFiles()方法看起来很方便 但是,如果在递归中发生异常,我该如何继续/从中恢复并继续枚举其余文件?
try
{
var files = from file in Directory.EnumerateFiles("c:\\",
"*.*", SearchOption.AllDirectories)
select new
{
File = file
};
Console.WriteLine(files.Count().ToString());
}
catch (UnauthorizedAccessException uEx)
{
Console.WriteLine(uEx.Message);
}
catch (PathTooLongException ptlEx)
{
Console.WriteLine(ptlEx.Message);
}
答案 0 :(得分:3)
我确实找到了解决方法。通过使用堆栈来推送枚举结果,人们确实可以处理异常。这是一段代码片段:(受this article启发)
List<string> results = new List<string>();
string start = "c:\\";
results.Add(start);
Stack<string> stack = new Stack<string>();
do
{
try
{
var dirs = from dir in Directory.EnumerateDirectories(
start, "*.*", SearchOption.TopDirectoryOnly)
select dir;
Array.ForEach(dirs.ToArray(), stack.Push);
start = stack.Pop();
results.Add(start);
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine(ex.Message);
start = stack.Pop();
results.Add(start);
}
} while (stack.Count != 0);
foreach (string file in results)
{
Console.WriteLine(file);
}
答案 1 :(得分:1)
我遇到了同样的问题并重新实现了功能。您可以在http://rwtools.codeplex.com/找到解决方案。
内部是类似“DirectoryEnumerator”和“FileEnumerator”的类,它们忽略错误,或者(如果sombody喜欢)抛出错误并继续迭代。
希望它有所帮助。
此致 桑德罗
答案 2 :(得分:0)
我认为这种方法无法正常工作。虽然捕获了UnauthorizedAccessException,但迭代会在发生时立即停止。因此,您只需获取在抛出异常之前检索到的所有文件。
答案 3 :(得分:-2)
对Directory.EnumerateFiles(..)
的调用只会设置枚举器,因为延迟评估。当你执行它时,使用foreach
可以引发异常。
因此,您需要确保在正确的位置处理异常,以便枚举可以继续。
var files = from file in Directory.EnumerateFiles("c:\\",
"*.*", SearchOption.AllDirectories)
select new
{
File = file
};
foreach (var file in files)
{
try
{
Console.Writeline(file);
}
catch (UnauthorizedAccessException uEx)
{
Console.WriteLine(uEx.Message);
}
catch (PathTooLongException ptlEx)
{
Console.WriteLine(ptlEx.Message);
}
}
中有一些额外的信息