Перечисление исключения метаданных

Я пытаюсь перечислить файлы на моем компьютере, используя приведенный ниже код, но каждый раз, когда он попадает в файл или директорию, для которых у меня нет разрешения на чтение, возникает исключение. Можно ли продолжить поиск после того, как было сгенерировано исключение? Я знаю, что у некоторых людей были подобные проблемы, но есть ли другой способ сделать это, кроме проверки каждого файла/папки в отдельности?

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

Спасибо за любую помощь, так как это сводит меня с ума!

Ответ 1

Я столкнулся с той же проблемой только сегодня. Я взломал следующий код. Если вы хотите использовать его в реальном продукте, вам может потребоваться улучшить обработку ошибок. Поскольку это было для одноразового script, мне было все равно.

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);
}

который записывает при перечислении и, следовательно, не требует одновременного хранения всех имен файлов в памяти.