2011-10-13 64 views
5

我想枚举通过我的计算机上的文件使用下面的代码,但每次它击中文件或目录,我没有权限读取它会引发异常。抛出异常后,我可以继续搜索吗?我知道有些人有类似的问题,但除了单独检查每个文件/文件夹之外,还有其他方式吗?枚举文件抛出异常

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

感谢您的任何帮助,因为这让我生气!

回答

10

就在今天我遇到了同样的问题。我一起砍了下面的代码。如果您想在实际产品中使用它,则可能需要改进错误处理。由于这是一个一次性脚本,我并不在乎。

static IEnumerable<string> EnumerateFilesRecursive(string root,string pattern="*") 
{ 
    var todo = new Queue<string>(); 
    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<string> files = EnumerateFilesRecursive(@"C:\");//Note that there is NO ToArray() 
foreach (string file in files) 
{ 
    Console.WriteLine(file); 
} 

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

+0

非常好,非常感谢分享你的代码。我无法弄清楚如何让它工作,但我对C#不是非常有经验。我试图把它作为一种方法,假设字符串根和字符串模式是args但没有运气,我只是想用Console.WriteLine()将它输出到控制台,我在哪里适合它?谢谢! –

+0

我希望我能给你+100!这很好,非常感谢你! –