枚举文件抛出exception

我试图使用下面的代码枚举我的计算机上的文件,但每次遇到我没有读取权限的文件或目录时都会引发exception。 抛出exception后有什么办法可以继续搜索吗? 我知道有些人有类似的问题,除了单独检查每个文件/文件夹之外还有其他方法吗?

try { string[] files = Directory.GetFiles(@"C:\", "*.*",SearchOption.AllDirectories); foreach (string file in files) { Console.WriteLine(file); } } catch { } 

谢谢你的帮助,因为这让我很生气!

我今天遇到了同样的问题。 我把以下代码整理在一起。 如果要在实际产品中使用它,可能需要改进error handling。 由于这是一次性剧本,我并不在意。

 static IEnumerable EnumerateFilesRecursive(string root,string pattern="*") { var todo = new Queue(); todo.Enqueue(root); while (todo.Count > 0) { string dir = todo.Dequeue(); string[] subdirs = new string[0]; string[] files = new string[0]; try { subdirs = Directory.GetDirectories(dir); files = Directory.GetFiles(dir, pattern); } catch (IOException) { } catch (System.UnauthorizedAccessException) { } foreach (string subdir in subdirs) { todo.Enqueue(subdir); } foreach (string filename in files) { yield return filename; } } } 

要使用它,您可以:

 string[] files = EnumerateFilesRecursive(@"C:\").ToArray();//Note the ToArray() foreach (string file in files) { Console.WriteLine(file); } 

它首先枚举所有文件,将所有文件名存储在内存中,然后才显示它们。 或者你可以:

 IEnumerable files = EnumerateFilesRecursive(@"C:\");//Note that there is NO ToArray() foreach (string file in files) { Console.WriteLine(file); } 

枚举时写入,因此不需要同时将所有文件名保留在内存中。