Как проверить, успешно ли удален System.IO.File.Delete удаленный файл

После удаления файла с использованием класса system.io.file:

System.IO.File.Delete(openedPdfs.path);

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

Проблема заключается в том, что метод удаления работает нормально, но для удаления файла требуется несколько секунд. Функция Exist возвращает true, потому что в то время, когда он проверяет файл, он существует.

Как я могу проверить, успешно ли завершена System.IO.File.Delete(openedPdfs.path);?

Код:

FileInfo file = new FileInfo(openedPdfs.path);    
System.IO.File.Delete(openedPdfs.path);
if (file.Exists == false)
{ ... }
else 
{ ... }

Ответ 1

Delete должен вызывать исключение, если файл не был удален. Следовательно, ваш вызов Exists является избыточным.

Посмотрите документацию для Delete.

Ответ 2

Как указывали другие, метод File.Delete генерирует исключение в случае отказа.

То, что они не указали, заключается в том, что исключение будет выбрано в почти во всех случаях, но не во всех случаях. В частности, метод File.Delete будет не выдавать исключение, если файл, который будет удален, уже не существует. (Дух? О чем они думали?)

Итак, вы должны проверить, существует ли файл до, чтобы удалить его; если этого не существует, вы ничего не должны делать. Если он существует, вы должны вызывать File.Delete, и если это выдает исключение, то опять вы ничего не должны делать, потому что файл не был удален. В противном случае вы должны сделать свой пост-успешный файл удаления существующего файла.

Ответ 3

Это вспомогательный для Daniel A. White ответ: мы можем видеть подпись для метода public static void Delete(string path). Таким образом, вы не получите обратную связь с вызовом Delete, за исключением исключения. Но предположим, что у вас есть файл, который периодически записывается или обновляется другим процессом:

  • Ваша программа успешно удалит файл.
  • Другой процесс воссоздает его сразу же после удаления.
  • Ваша программа проверяет существование с помощью file.Exists. Там новый файл с тем же именем, что и возвращает true. Вы технически идете по неправильному пути.

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

Ответ 4

Он не будет генерировать исключение, если файл не существует. В случае ошибки он будет генерировать исключение, если он не может быть удален, отметьте File.Delete

Ответ 5

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

 System.IO.File.Exists(path)

Хотя я согласен с Даниэлем, если Delete не генерирует исключение, вы должны быть хорошими.

Ответ 6

В комментариях и предложениях вы должны использовать следующее, чтобы достичь желаемого результата.

try {
  FileInfo file = new FileInfo(openedPdfs.path);    
  System.IO.File.Delete(openedPdfs.path);
  // if no exception is thrown then you should assume all has gone well and put  
  // your file successfully deleted code here.
} catch /*(Specfic exceptions can be referenced here in separate catch blocks see Daniel A. White answer)*/ {
  // If something bad happened and the file was not deleted put handling code here
} finally {
  // if some action needs to be taken regardless of whether the file was successfully deleted or not put 
  // that code here
}

Ответ 7

Я обнаружил, что если вы используете метод экземпляра FileInfo Delete(), то свойство экземпляра FileInfo Exists не обновляется.
Например, следующий код будет генерировать исключение, не найденное файлом, поскольку файл был удален, а второй if (output_file.Exists) по-прежнему оценивается как true.

FileInfo output_file;
if (output_file.Exists) output_file.Delete();   

FileStream fs;
if (output_file.Exists)
{
     fs = new FileStream(fi.FullName, FileMode.Open, FileAccess.ReadWrite);
}
else
{
     fs = new FileStream(fi.FullName, FileMode.CreateNew, FileAccess.ReadWrite);
}

Я обнаружил, что создание новой FileInfo из старой устраняет проблему:

FileInfo output_file;
if (output_file.Exists)
{
    output_file.Delete();
    output_file = new FileInfo(output_file.FullName);      
}

FileStream fs;
if (output_file.Exists)
{
     fs = new FileStream(fi.FullName, FileMode.Open, FileAccess.ReadWrite);
}
else
{
     fs = new FileStream(fi.FullName, FileMode.CreateNew, FileAccess.ReadWrite);
}