Как проверить, доступен ли каталог, не перехватывая System.UnauthorizedAccessException

Я искал и искал в сети, но не смог найти хорошего решения этой проблемы.

Вот мой код:

protected bool isFileValid(FileSystemInfo ifo)
{
   if (!ifo.Exists || ifo.Name.StartsWith("$") || ifo.Name.Equals("System Volume Information"))
        return false;
   if(ifo is DirectoryInfo){
        try
        {
           ((DirectoryInfo)ifo).GetFileSystemInfos();
        }
        catch (Exception e) { LogUtil.Debug("Exception in isFileValid" + e.Message); return false; }
   }
   return true;
}

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

Под "доступом к Справочнику" я подразумеваю вызов GetFileSystemInfos() без исключения. isFileValid вызывается моим приложением для каждого FileSystemInfo, чтобы определить, доступен ли он описанным мной способом.

Заранее благодарим за любые идеи, как решить эту проблему.


person user1531730    schedule 18.07.2012    source источник


Ответы (1)


Вы можете попробовать просмотреть свойство DirectoryInfo.Exists (ссылка на документацию )

Свойство Exists возвращает false, если возникает какая-либо ошибка при попытке определить, существует ли указанный файл. Это может происходить в ситуациях, которые вызывают исключения, например при передаче имени файла с недопустимыми символами или слишком большим количеством символов, отказе или отсутствии диска или если у вызывающего абонента нет разрешения на чтение файла.

(Выделение мое).

Вот небольшой пример:

var di = (DirectoryInfo)ifo;
if(di.Exists)
{
    di.GetFileSystemInfos();
}

Изменить. Похоже, у вас работают переменные среды. Я предполагаю, что где-то до вызова этого метода вы создаете FileSystemInfo из пути к файлу, хранящегося в строке. Вам нужно развернуть его вот так:

string expandedFilePath = Environment.ExpandEnvironmentVariables(filePath);

перед созданием FileSystemInfo из этого.

http://msdn.microsoft.com/en-us/library/system.environment.expandenvironmentvariables.aspx

person Bridge    schedule 18.07.2012
comment
Спасибо за ответ, но, к сожалению, он не работает: / В опубликованном мной коде я уже проверяю, ifo.Exists равно false. Но даже если это true, вы получите исключение при попытке вызвать GetFileSystemInfos в Каталоге, таком как% USER% \ Application Data (я также пытался преобразовать FileSystemInfo в DirectoryInfo перед вызовом Exists) - person user1531730; 18.07.2012
comment
@ user1531730 Извините, я не нашел этого в вашем коде! Вы не упоминаете, откуда вы это берете, но похоже, что это основано на переменных среды! Добавлю немного к своему ответу. - person Bridge; 18.07.2012
comment
@ user1531730 Я добавил еще кое-что, что может помочь. Возможно, стоит добавить ваш пример пути к файлу, который не соответствует исходному вопросу! - person Bridge; 18.07.2012
comment
нет, я не работаю с переменными окружения. Моя FileSystemInfos такая же, как я уже писал, создается путем вызова GetFileSystemInfos в родительский каталог. С помощью строкового конструктора создается только Root DirectoryInfo, но он также не содержит переменных среды. Должен быть способ проверить, действителен ли вызов GetFileSystemInfos в Directoy, кроме как просто попробовать его и поймать исключение. Но вроде это непросто :( - person user1531730; 19.07.2012