枚举文件抛出异常

Bal*_*i C 6 c# file

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

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

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

Cod*_*aos 11

我今天遇到了同样的问题.我把以下代码一起攻击了.如果要在实际产品中使用它,可能需要改进错误处理.由于这是一次性脚本,我不在乎.

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用它,您可以:

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

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

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

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