2014-12-29 5 views
0

Согласно this MSDN article, Directory.Exists может возвращать ложные негативы (каталог существует, но вы не можете его прочитать или подобное). Мне было интересно, есть ли подобный метод, вместо того, чтобы возвращать true или false, возвращает что-то более информативное ... например «access denied» или, возможно, «слишком длинный путь» ...Надежный каталог. Использует C#

ответ

1

Вы можете попробовать создать DirectoryInfo вместо этого. Конструктор должен исключать исключения, если путь недействителен или у пользователя нет доступа. Вы все равно должны проверить, существует ли это.

try 
{ 
    var di = new DirectoryInfo(path); 
    if(di.Exists) 
    { 
     //The directory exists 
    } 
    else 
    { 
     //The path is valid, but does not exist. 
    } 
} 
catch(Exception e) 
{ 
    //The path is invalid or user does not have access. 
} 
+0

Я не думаю, что это правда, что' DirectoryInfo' конструктор генерирует исключения для путей, которые не существуют, или для которых вы не» у меня есть доступ. По крайней мере, это не было в результате быстрого теста, который я только что побежал. О, но теперь я вижу, что вы говорили о действительно недействительном пути, а не о том, что его не существует. для OP? – adv12

+0

@ adv12 Проверьте ссылку на документацию MSDN. Вам все равно нужно проверить, существует ли она, как я уже упоминал. – juharr

+0

О, я вижу, что OP хочет поймать ошибки, такие как «путь слишком длинный», этим конструктором. – adv12

1

Существует Directory.GetAccessControl() метод, который вы можете использовать, чтобы получить перечислимые но нечитаемые каталоги:

public static bool DirectoryVisible(string path) 
{ 
    try 
    { 
     Directory.GetAccessControl(path); 
     return true; 
    } 
    catch (UnauthorizedAccessException) 
    { 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 

Вы также можете использовать DirectoryInfo класс. Он поставляется с Exists и Attributes. Если есть UnauthorizedAccessException, брошенный при доступе к свойству Attributes, то это означает, что вы не можете получить доступ к каталогу.

0

source

этот код может различать, если на самом деле существует файл, и если файл делает, но пользователь не имеет доступа

enum ExistState { exist, notExist, inaccessible }; 

void Check(string name) { 
    DirectoryInfo di = new DirectoryInfo(name); 
    ExistState state = ExistState.exist; 
    if (!di.Exists) { 
     try { 
      if ((int)di.Attributes == -1) { 
       state = ExistState.notExist; 
      } 
     } catch (UnauthorizedAccessException) { 
      state = ExistState.inaccessible; 
     } 
    } 
    Console.WriteLine("{0} {1}", name, state); 
} 

объяснения от источника
« Свойство DirectoryInfo.Attributes неправильно документировано и не вызывает исключения FileNotFound или DirectoryNotFound, но вместо этого возвращает значение ошибки из базовой функции api win, которая равна 0xFFFFFFFF или -1.

Если путь существует, но доступ запрещен, попытка получить атрибуты вызовет исключение.

Если путь не существует, то атрибуты будут -1.»

Смежные вопросы