Подтвердить что ты не робот

Как проверить, будет ли File.Delete() успешным, если не попробовать, в С#?

В С# System.IO.File.Delete(filePath) либо удалит указанный файл, либо вызовет исключение. Если у текущего пользователя нет разрешения на удаление файла, он вызовет исключение UnauthorizedAccessException.

Есть ли какой-то способ, который я могу сказать заранее, удастся ли удалить исключение UnauthorizedAccessException или нет (т.е. запросить ACL, чтобы узнать, имеет ли текущий идентификатор потока разрешение на удаление указанного файла?)

В основном я ищу:

if (FileIsDeletableByCurrentUser(filePath)) {
    /* remove supporting database records, etc. here */
    File.Delete(filePath);
}

но я не знаю, как реализовать FileIsDeletableByCurrentUser().

4b9b3361

Ответ 2

Проблема с реализацией FileIsDeletableByCurrentUser заключается в том, что это невозможно сделать. Причина в том, что файловая система является постоянно меняющимся элементом.

Между любыми проверками, которые вы делаете в файловой системе и следующей операцией, может и произойдет любое количество событий. Включая...

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

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

Ответ 4

Строго говоря, UnauthorizedAccessException означает, что путь является каталогом, поэтому вы можете использовать команду типа System.IO.Path.GetFileName(путь) и вызывать исключение аргумента.

Но если вы хотите получить более целостное решение, используйте System.IO.File.GetAccessControl, как упоминается Dale Halliwell

Ответ 5

Как указано выше. Просмотрите разрешения файлов и сравните их с пользователем, который запускает приложение.

Вы всегда можете использовать этот aproach, а

bool deletemyfile()  
{  
    try  
    {  
        ...delete my file  
        return true;  
    }  
    catch  
    {  
        return false;  
    }  
}

если он возвращает false, вы знаете, что он сработал, если он возвращает true, тогда.. он сработал, и файл исчез. Не уверен, что вы после точно, но это было лучшее, что я мог придумать

Ответ 6

Конечно, вы можете проверять флаги ReadOnly с использованием System.IO и, возможно, ACL-безопасности в файле в сочетании с текущим пользователем, но, как пишет Mehrdad в своем комментарии, он никогда не будет полностью доказан во всех случаях. Таким образом, вам понадобится обработка исключений для исключительного случая (даже если это просто самый популярный на уровне верхнего уровня, который регистрирует/показывает "неожиданную проблему" и убивает ваше приложение).

Ответ 7

Вы должны получить список управления доступом (ACL) этого файла.

Но это не обязательно означает, что вы действительно можете удалить его, поскольку флаг readonly может быть установлен или другая программа заблокировала файл.

Ответ 8

Похоже, было бы проще делать что-то в следующем порядке:

  • Получите всю необходимую информацию о файле, чтобы сделать другие части (удалить данные базы данных и т.д.).
  • Попробуйте удалить файл
  • Если вы успешно удалите файл, выполните оставшуюся часть "очистки". Если вы не удалите его успешно, верните/обработайте исключение и т.д.