.NET - проверьте, доступен ли каталог без обработки исключений

Мне нужно просмотреть различные каталоги на компьютере (через DirectoryInfo). Некоторые из них недоступны, и возникает исключение UnauthorizedAccessException. Как я могу проверить доступ к каталогу, не перехватив исключение?


person SharpAffair    schedule 25.02.2010    source источник


Ответы (3)


Вам нужно использовать пространство имен Security.

См. это ТАК ответ.

Из ответов:

FileIOPermission writePermission = new FileIOPermission(FileIOPermissionAccess.Write, filename);
if(!SecurityManager.IsGranted(writePermission))
{
  //No permission. 
  //Either throw an exception so this can be handled by a calling function
  //or inform the user that they do not have permission to write to the folder and return.
}

Обновление: (после комментариев)

FileIOPermission имеет дело с политиками безопасности, а не с разрешениями файловой системы, поэтому вам необходимо использовать DirectoryInfo.GetAccessControl.

person Oded    schedule 25.02.2010
comment
Я пробовал следующее: Dim readPermission As New FileIOPermission (FileIOPermissionAccess.Read, C: \ Users \ Admin \ Documents \ My Pictures) Приведенная выше попытка доступа к каталогу вызывает отказ в доступе, но SecurityManager.IsGranted (readPermission) всегда возвращает true. - person SharpAffair; 25.02.2010
comment
Из msdn.microsoft.com/en-us/library /: Granting of permissions is determined by policy and is different from a demand subject to overrides, such as an assert. Also, IsGranted only tests the grant of the calling code assembly, independent of other callers on the stack. - person Oded; 25.02.2010
comment
Это неправильный ответ. FileIOPermission имеет дело с CAS, а не с файловой системой. Другими словами, разрешает ли доступ политика безопасности .NET. У вас может быть доступ к CAS, но Windows все равно может его запретить. DirectoryInfo.GetAccessControl () не требуется. - person Hans Passant; 25.02.2010
comment
@HansPassant DirectoryInfo.GetAccessControl () может вызвать исключение, если предоставлено no read permission rights. Но все же может быть право перечислить содержимое папки. В этом случае GetAccessControl () не поможет. - person marsh-wiggle; 03.12.2015
comment
На всякий случай, если кому-то интересно, я сделал небольшой фрагмент, используя GetAccessControl здесь - person Chibueze Opata; 18.05.2018

Проще говоря, вы не можете. Невозможно проверить, доступен ли каталог, все, что вы можете определить, это то, что он был доступен. Причина в том, что как только проверка завершится, разрешения могут измениться и сделать ваш чек недействительным. Самая надежная стратегия, которую вы можете реализовать, - получить доступ к каталогам и перехватить UnauthorizedAccessException.

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

person JaredPar    schedule 25.02.2010

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

person JDMcK    schedule 18.05.2010