Ответ 1
Взгляните на эту статью - http://www.codeproject.com/KB/files/UserFileAccessRights.aspx
В С# System.IO.File.Delete(filePath) либо удалит указанный файл, либо вызовет исключение. Если у текущего пользователя нет разрешения на удаление файла, он вызовет исключение UnauthorizedAccessException.
Есть ли какой-то способ, который я могу сказать заранее, удастся ли удалить исключение UnauthorizedAccessException или нет (т.е. запросить ACL, чтобы узнать, имеет ли текущий идентификатор потока разрешение на удаление указанного файла?)
В основном я ищу:
if (FileIsDeletableByCurrentUser(filePath)) {
/* remove supporting database records, etc. here */
File.Delete(filePath);
}
но я не знаю, как реализовать FileIsDeletableByCurrentUser().
Взгляните на эту статью - http://www.codeproject.com/KB/files/UserFileAccessRights.aspx
Проблема с реализацией FileIsDeletableByCurrentUser
заключается в том, что это невозможно сделать. Причина в том, что файловая система является постоянно меняющимся элементом.
Между любыми проверками, которые вы делаете в файловой системе и следующей операцией, может и произойдет любое количество событий. Включая...
Лучшая функция, которую вы могли бы написать, наиболее точно назвали бы FileWasDeletableByCurrentUser
.
Вы пробовали System.IO.File.GetAccessControl(имя файла), он должен вернуть FileSecurity с информацией о разрешениях для этого файла.
Строго говоря, UnauthorizedAccessException означает, что путь является каталогом, поэтому вы можете использовать команду типа System.IO.Path.GetFileName(путь) и вызывать исключение аргумента.
Но если вы хотите получить более целостное решение, используйте System.IO.File.GetAccessControl, как упоминается Dale Halliwell
Как указано выше. Просмотрите разрешения файлов и сравните их с пользователем, который запускает приложение.
Вы всегда можете использовать этот aproach, а
bool deletemyfile()
{
try
{
...delete my file
return true;
}
catch
{
return false;
}
}
если он возвращает false, вы знаете, что он сработал, если он возвращает true, тогда.. он сработал, и файл исчез. Не уверен, что вы после точно, но это было лучшее, что я мог придумать
Конечно, вы можете проверять флаги ReadOnly с использованием System.IO и, возможно, ACL-безопасности в файле в сочетании с текущим пользователем, но, как пишет Mehrdad в своем комментарии, он никогда не будет полностью доказан во всех случаях. Таким образом, вам понадобится обработка исключений для исключительного случая (даже если это просто самый популярный на уровне верхнего уровня, который регистрирует/показывает "неожиданную проблему" и убивает ваше приложение).
Вы должны получить список управления доступом (ACL) этого файла.
Но это не обязательно означает, что вы действительно можете удалить его, поскольку флаг readonly может быть установлен или другая программа заблокировала файл.
Похоже, было бы проще делать что-то в следующем порядке: