Мне нужно просмотреть различные каталоги на компьютере (через DirectoryInfo). Некоторые из них недоступны, и возникает исключение UnauthorizedAccessException. Как я могу проверить доступ к каталогу, не перехватив исключение?
.NET - проверьте, доступен ли каталог без обработки исключений
Ответы (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
.
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
no read permission rights
. Но все же может быть право перечислить содержимое папки. В этом случае GetAccessControl () не поможет.
- person marsh-wiggle; 03.12.2015
Проще говоря, вы не можете. Невозможно проверить, доступен ли каталог, все, что вы можете определить, это то, что он был доступен. Причина в том, что как только проверка завершится, разрешения могут измениться и сделать ваш чек недействительным. Самая надежная стратегия, которую вы можете реализовать, - получить доступ к каталогам и перехватить UnauthorizedAccessException
.
Я недавно написал в блоге статью на эту тему, в которой подробно рассказывается здесь.
вы можете просто создать небольшую простую логическую функцию и заставить переменную информации о каталоге попытаться получить каталоги по заданному пути. если все прошло без проблем, верните истину, если исключение - дескриптор, верните ложь или разбейте предложение об исключении на дополнительные исключения и получите код ошибки.