Я думаю , это отвечает на Ваш вопрос - в основном не, если класс не прибывает из специального загрузчика класса, и это разгружает класс.
Это вполне допустимый способ проверить доступ к папке в C #. Единственное место, где он может упасть, - это если вам нужно вызвать это в замкнутом цикле, где накладные расходы на исключение могут быть проблемой.
Я согласен с Эшем, это должно быть хорошо. В качестве альтернативы вы можете использовать декларативный CAS и фактически предотвратить запуск программы, если у них нет доступа.
Я считаю, что некоторые из функций CAS могут отсутствовать в C # 4.0 из того, что я слышал, а не уверен, может ли это быть проблемой.
Ваш код получает DirectorySecurity
для данный каталог и правильно обрабатывает исключение (из-за того, что у вас нет доступа к информации безопасности). Однако в вашем примере вы фактически не опрашиваете возвращенный объект, чтобы узнать, какой доступ разрешен - и я думаю, вам нужно добавить это.
ИМХО, единственный 100% надежный способ проверить, можете ли вы писать в каталог, - это записать в него и в конечном итоге перехватить исключения.
У вас есть потенциальное состояние гонки в вашем коде - что произойдет, если у пользователя есть разрешения на запись в папку, когда вы проверяете, но до того, как пользователь фактически записывает в папку, это разрешение отозвано ? Запись вызовет исключение, которое вам нужно будет поймать и обработать. Так что первоначальная проверка бессмысленна. С таким же успехом вы можете просто писать и обрабатывать любые исключения. Это стандартный шаблон для вашей ситуации.
http://www.codeproject.com/KB/files/UserFileAccessRights.aspx
Very usefull Class, check for improved version in messages bellow.
Вы можете попробовать следующий блок кода, чтобы проверить, имеет ли каталог доступ на запись. Он проверяет FileSystemAccessRule.
string directoryPath = "C:\\XYZ"; //folderBrowserDialog.SelectedPath;
bool isWriteAccess = false;
try
{
AuthorizationRuleCollection collection =
Directory.GetAccessControl(directoryPath)
.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount));
foreach (FileSystemAccessRule rule in collection)
{
if (rule.AccessControlType == AccessControlType.Allow)
{
isWriteAccess = true;
break;
}
}
}
catch (UnauthorizedAccessException ex)
{
isWriteAccess = false;
}
catch (Exception ex)
{
isWriteAccess = false;
}
if (!isWriteAccess)
{
//handle notifications
}