Исключение несанкционированного доступа Метод DirectoryInfo.GetFiles()

Я написал программу (на Windows 7), которая вызывает метод DirectoryInfo.GetFiles(), и в папке документы и настройки у меня есть исключение UnauthorizedAccess.

Я пробовал много решений, например:

создать манифест с


    `<requestedExecutionLevel level="highestAvailable" uiAccess="false" />`

and also with this

    DirectorySecurity dSecurity = Directory.GetAccessControl(dir.FullName);
    dSecurity.AddAccessRule(new FileSystemAccessRule("Luca", FileSystemRights.FullControl, AccessControlType.Allow));
    
    Directory.SetAccessControl(dir.FullName, dSecurity);

В чем может быть проблема?


person Gasta87    schedule 03.06.2013    source источник
comment
Щелкните правой кнопкой мыши и запустите приложение от имени администратора.   -  person mojtaba    schedule 04.06.2013
comment
в соответствии с этим метода FileInfo.GetFiles() не существует.   -  person Kcvin    schedule 04.06.2013
comment
Ха-ха... почти уверен, что он имел в виду DirectoryInfo.GetFiles(). @ user2424742, вы используете рекурсивную опцию AllDirectories?   -  person Idle_Mind    schedule 04.06.2013
comment
@Idle_Mind Я не знаю, о чем ты говоришь, извини! Так что, думаю, я не использую этот вариант. Я также пытался щелкнуть правой кнопкой мыши и запустить от имени администратора, но это не работает. Кто-нибудь может сделать программу, которая без исключения создает древовидную структуру, которая может просматривать все папки и файлы на моем компьютере с WINDOWS SEVEN??? :) Спасибо!   -  person Gasta87    schedule 05.06.2013
comment
Если вы получаете исключения несанкционированного доступа при попытке составить список файлов, вы не сможете получить полный список. В лучшем случае вы сможете получить папки/файлы, к которым у вас есть доступ.   -  person Matthew Brubaker    schedule 26.07.2013


Ответы (4)


Во-первых, вы должны использовать DirectoryInfo.EnumerateFiles(...) вместо GetFiles(...). EnumerateFiles(...) избавляет вас от необходимости получать весь список до тех пор, пока вам это действительно не понадобится.

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

Вы можете увидеть результат моего исследования в следующей теме. DirectoryInfo.EnumerateFiles(...) вызывает UnauthorizedAccessException (и другие исключения)

person Matthew Brubaker    schedule 25.07.2013

Просто Quick Copy Paste, потому что у меня была такая же проблема. Настройте код в соответствии с вашими потребностями (потому что я рассчитываю размер, считая все файлы и «сохраняю» все файлы, которые хочу скопировать в список). После того, как вы получили все файлы в своем списке, вы можете начать их копирование или что-то еще, что вы хотите сделать с файлами:

private double CalculateSize(string sourcePath, Progress state, List<FileInfo> filesToCopy)
    {
        int _fileCount = 0;
        DirectoryInfo sourceDirectory = new DirectoryInfo(sourcePath);

        FileInfo[] files = null;
        try
        {
            files = sourceDirectory.GetFiles();
        }
        catch(UnauthorizedAccessException ex)
        { 
            // DO SOME LOGGING-MAGIC IN HERE...
        }

        if (files != null)
        {
            foreach (FileInfo file in files)
            {
                fullSizeToCopy += file.Length;
                filesToCopy.Add(file);
                _fileCount++;
            }
        }

        DirectoryInfo[] directories = null;
        try
        {
            directories = sourceDirectory.GetDirectories();
        }
        catch(UnauthorizedAccessException ex)
        {
            // Do more logging Magic in here...
        }
        if (directories != null)
        foreach (DirectoryInfo direcotry in directories)
        {
            CalculateSize(direcotry.FullName, state, filesToCopy);
        }
        state.FileCount = _fileCount;

        return fullSizeToCopy;
    }
person Locke    schedule 12.08.2016

Лучше всего поставить вокруг вызова блокировку try/catch и игнорировать любые каталоги, к которым у вас нет доступа. Возможно, это не лучшее решение, но, по крайней мере, ваш метод получит все каталоги, к которым у вас есть доступ. Что-то вроде этого:

try
{
    directory.GetFiles();
}
catch (UnauthorizedAccessException)
{
    string logMsg = string.Format("Unable to access directory {0}", directory.FullName);
    //Handle any desired logging here
}
person Adam Nelson    schedule 25.07.2013
comment
В конечном итоге это не работает в долгосрочной перспективе. Он не сможет вернуть полное перечисление папок/файлов, к которым у вас есть доступ. Результирующий список будет включать только те файлы/папки, которые были проверены до попадания в исключение. - person Matthew Brubaker; 26.07.2013

Как и в случае с blow, используйте EnumerateDirectories, а не DirectoryInfo.getfiles.

private void ScanEmptyDirs(string dir, ref int cnt, CancellationToken token)
    {
        if (String.IsNullOrEmpty(dir))
        {
            throw new ArgumentException("Starting directory is a null reference or an empty string: dir");
        }
        try
        {
            foreach (var d in Directory.EnumerateDirectories(dir))
            {                  
                if (token.IsCancellationRequested)
                {
                    token.ThrowIfCancellationRequested();
                }
                ScanEmptyDirs(d, ref cnt, token);
            }
            EmptyJudge(dir, ref cnt);
        }
        catch (UnauthorizedAccessException) { }
    }
person Jared DC    schedule 02.07.2021