Игнорировать недоступные файлы в DirectoryInfo.GetFiles

Итак, я пытаюсь создать программу поиска файлов, которая также должна выполнять поиск по всем подпапкам данной папки. Проблема в том, что если я хочу найти, например, C:\, я получаю UnauthorizedAccessException. Я знаю, что мог бы сделать заявление «Попробовать», но это тоже не работает, потому что тогда FileInfo остается Ничего.

Вот мой код:

Sub SubfolderSearch()

    Dim diar2 As IO.FileInfo()
    Dim di2 As New IO.DirectoryInfo(Path)

    diar2 = di2.GetFiles("*", IO.SearchOption.AllDirectories) 'The Error occurs in this line

    Dim dra As IO.FileInfo

        For Each dra In diar2

            Dim FileName As String = dra.Name
            Dim FilePath As String = dra.FullName
            Dim FileSize As Integer = dra.Length / 1000

            'Search Procedure'

        Next

        SubfolderThread.Abort()

person OneByte_    schedule 13.12.2015    source источник
comment
Вы неправильно подходите к этому с Try..Catch. Вы сможете обойти это, выполнив операцию над FileName (например, If (Not FileName.ToString() == "") Then.   -  person AStopher    schedule 13.12.2015
comment
Я думаю, вы не совсем поняли. Я пытаюсь получить FileInfo всех файлов, к которым у меня есть доступ, чтобы иметь возможность читать FileName и все такое.   -  person OneByte_    schedule 13.12.2015
comment
Если у вас есть доступ к этим файлам, почему вы получаете исключение UnauthorizedAccessException? Windows лжет вам? Извините, но мы также не можем это исправить.   -  person varocarbas    schedule 13.12.2015
comment
Нет, я имею в виду, что у меня есть доступ к НЕКОТОРЫМ файлам, но не ко всем. FileInfo.GetFiles пытается получить ВСЕ файлы, даже если у меня нет к ним доступа. И если он пытается получить FileInfo недоступного файла, я получаю сообщение об ошибке, например, у меня есть доступ к папке Windows, но не к документам и настройкам.   -  person OneByte_    schedule 13.12.2015
comment
Вы пробовали то, что я сказал?   -  person AStopher    schedule 13.12.2015
comment
Ну, я не могу получить FileName, если у меня нет FileInfo, поэтому то, что вы сказали, невозможно. :(   -  person OneByte_    schedule 13.12.2015
comment
Да, именно поэтому я сказал использовать Try..Catch. Если это не удастся, он вырвется и попробует следующий файл.   -  person AStopher    schedule 13.12.2015
comment
Я что-то не понимаю? Где я должен использовать Try..Catch? Извините, если я просто сейчас веду себя глупо. ›_‹   -  person OneByte_    schedule 13.12.2015
comment
Вопрос по-прежнему не имеет никакого смысла, и подход @cybermonkey кажется тем, что вы ищете. То есть: GetFiles получает только список имен (= ошибка не возникает), тогда вы можете делать с этим списком все, что хотите: либо пропустить имена, которые, как вы знаете, неверны, либо полагаться на try catch, который позаботится о неправильном единицы автоматически (т. е. позволит продолжить цикл, несмотря на ошибки). Но основная идея точно такая же: спрашивать, что вы можете сделать, чтобы избежать исключения UnauthorizedAccessException, кажется крайне офтопическим (= просто избегайте всего, что его провоцирует).   -  person varocarbas    schedule 13.12.2015
comment
@OneByte_ Предоставил ответ.   -  person AStopher    schedule 13.12.2015
comment
Единственная проблема заключается в том, что UnauthorizedAccessException возникает в операторе GetFiles, поэтому там возникает ошибка.   -  person OneByte_    schedule 13.12.2015
comment
@OneByte_ Вы не пояснили это. Обновите свой вопрос, указав точно, где возникает ошибка.   -  person AStopher    schedule 13.12.2015
comment
Дубликат Игнорировать папки/файлы, когда Directory.GetFiles() отклонен access (по сути, запрашивает одно и то же, не имеет значения, что языки разные, поскольку они оба .NET).   -  person AStopher    schedule 13.12.2015
comment
Хорошо, извините, я отредактировал вопрос сейчас.   -  person OneByte_    schedule 13.12.2015
comment
Я понял теперь о том, в чем проблема здесь. Вы должны использовать System.IO.Directory.GetFiles (я интуитивно думал, что это так), он просто получает имена файлов и не вызывает никаких проблем с доступом. Версия, которую вы используете (одна из DirectoryInfo, с тем же именем, но с другим именем, гораздо более агрессивна и требует доступа к файлам). Использование вышеупомянутой альтернативы решит вашу проблему (если у вас нет доступа к корневому каталогу; в этом случае решения нет).   -  person varocarbas    schedule 13.12.2015


Ответы (1)


Вам необходимо использовать Directory.EnumerateFiles() для чтения файл за файлом, чтобы можно было игнорировать исключения, связанные с отказом в доступе. Если вы используете функцию GetFiles(), вы в конечном итоге вернете весь массив и не сможете перехватывать исключения и продолжать работу, если одно из них недоступно.

MSDN говорит:

Методы EnumerateFiles и GetFiles различаются следующим образом: при использовании EnumerateFiles можно начать перечисление коллекции имен до того, как будет возвращена вся коллекция; когда вы используете GetFiles, вы должны дождаться возврата всего массива имен, прежде чем вы сможете получить доступ к массиву. Поэтому, когда вы работаете со многими файлами и каталогами, EnumerateFiles может быть более эффективным.

Так что используйте это так:

For Each dra In di2.EnumerateFiles("*", IO.SearchOption.AllDirectories)
    Dim FileName As String = dra.Name
    Dim FilePath As String = dra.FullName
    Dim FileSize As Integer = dra.Length / 1000
    'Search Procedure'
    'Put a try-catch block here.
Next
person Fᴀʀʜᴀɴ Aɴᴀᴍ    schedule 13.12.2015