Получить доступ к папкам Windows в C # - PullRequest
0 голосов
/ 22 сентября 2018

Я делаю программное обеспечение с Winforms и C # 7.0.Я должен получить все файлы в C:\Program Files и C:\Program Files (x86).Когда я пытаюсь Directory.GetFiles(@"C:\Program Files\", "*.*", SearchOption.AllDirectories, я получаю исключение, что доступ к пути C: \ Program Files \ Common Files 'запрещен.

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

С уважением

1 Ответ

0 голосов
/ 22 сентября 2018

Вам придется пропустить каталоги, которые вы не можете прочитать (при условии, что вы не можете запустить свою программу под учетной записью System или другой учетной записью с правами на чтение всех каталогов).

Вы должны бытьосторожно, потому что вы не можете использовать yield внутри try/catch.Вот один из подходов:

public static IEnumerable<string> EnumFilesRecursively(string rootDirectory)
{
    // Helper method to call GetEnumerator(), returning null on exception.

    IEnumerator<T> getEnumerator<T>(Func<IEnumerable<T>> getEnumerable)
    {
        try   { return getEnumerable().GetEnumerator(); }
        catch { return null; }
    }

    // Enumerate all files in the current root directory.

    using (var enumerator = getEnumerator(() => Directory.EnumerateFiles(rootDirectory)))
    {
        if (enumerator != null)
            while (enumerator.MoveNext())
                yield return enumerator.Current;
    }

    // Recursively enumerate all subdirectories.

    using (var enumerator = getEnumerator(() => Directory.EnumerateDirectories(rootDirectory)))
    {
        if (enumerator != null)
            while (enumerator.MoveNext())
                foreach (var file in EnumFilesRecursively(enumerator.Current))
                    yield return file;
    }
}

Чтобы проверить это:

public static void Main(string[] args)
{
    foreach (var file in EnumFilesRecursively(@"C:\Program Files\"))
    {
        Console.WriteLine(file);
    }
}
...