Решение проблемы UnauthorizedAccessException для списка файлов - PullRequest
0 голосов
/ 15 июня 2009

При перечислении всех файлов на диске, отличном от моего системного диска, выдается UnauthorizedAccessException.

Как мне решить эту проблему?

Есть ли способ предоставить моему приложению необходимый доступ?


Мой код:

Directory.GetFiles("S:\\", ...)

Ответы [ 3 ]

2 голосов
/ 25 апреля 2012

Вот класс, который будет работать:

public static class FileDirectorySearcher
{
    public static IEnumerable<string> Search(string searchPath, string searchPattern)
    {
        IEnumerable<string> files = GetFileSystemEntries(searchPath, searchPattern);

        foreach (string file in files)
        {
            yield return file;
        }

        IEnumerable<string> directories = GetDirectories(searchPath);

        foreach (string directory in directories)
        {
            files = Search(directory, searchPattern);

            foreach (string file in files)
            {
                yield return file;
            }
        }
    }

    private static IEnumerable<string> GetDirectories(string directory)
    {
        IEnumerable<string> subDirectories = null;
        try
        {
            subDirectories = Directory.EnumerateDirectories(directory, "*.*", SearchOption.TopDirectoryOnly);
        }
        catch (UnauthorizedAccessException)
        {
        }

        if (subDirectories != null)
        {
            foreach (string subDirectory in subDirectories)
            {
                yield return subDirectory;
            }
        }
    }

    private static IEnumerable<string> GetFileSystemEntries(string directory, string searchPattern)
    {
        IEnumerable<string> files = null;
        try
        {
            files = Directory.EnumerateFileSystemEntries(directory, searchPattern, SearchOption.TopDirectoryOnly);
        }
        catch (UnauthorizedAccessException)
        {
        }

        if (files != null)
        {
            foreach (string file in files)
            {
                yield return file;
            }
        }
    }
}

Вы можете использовать его так:

IEnumerable<string> filesOrDirectories = FileDirectorySearcher.Search(@"C:\", "*.txt");

foreach (string fileOrDirectory in filesOrDirectories)
{
   // Do something here.
}

Это рекурсивно, но использование yield дает низкий объем памяти (менее 10 КБ в моем тестировании). Если вам нужны только файлы, соответствующие шаблону, а не каталоги, просто замените EnumerateFileSystemEntries на EnumerateFiles.

1 голос
/ 15 июня 2009

Разрешено ли доступу к диску? Может ли программа получить доступ к диску, если он не запущен из Visual Studio? Определены ли ограничительные разрешения на странице безопасности проекта (" Страница безопасности, Project Designer ")?

0 голосов
/ 15 июня 2009

Я решил проблему. Не совсем, но, по крайней мере, источник.

Исключением был параметр SearchOption.AllDirectories.

Но когда я просто перечисляю непосредственные файлы, используя Directories.GetFiles, это работает.

Это достаточно хорошо для меня.

Есть ли способ решить проблему рекурсивного листинга?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...