Ответ 1
Delete
должен вызывать исключение, если файл не был удален. Следовательно, ваш вызов Exists
является избыточным.
Посмотрите документацию для 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
{ ... }
Delete
должен вызывать исключение, если файл не был удален. Следовательно, ваш вызов Exists
является избыточным.
Посмотрите документацию для Delete
.
Как указывали другие, метод File.Delete
генерирует исключение в случае отказа.
То, что они не указали, заключается в том, что исключение будет выбрано в почти во всех случаях, но не во всех случаях. В частности, метод File.Delete
будет не выдавать исключение, если файл, который будет удален, уже не существует. (Дух? О чем они думали?)
Итак, вы должны проверить, существует ли файл до, чтобы удалить его; если этого не существует, вы ничего не должны делать. Если он существует, вы должны вызывать File.Delete
, и если это выдает исключение, то опять вы ничего не должны делать, потому что файл не был удален. В противном случае вы должны сделать свой пост-успешный файл удаления существующего файла.
Это вспомогательный для Daniel A. White ответ: мы можем видеть подпись для метода public static void Delete(string path)
. Таким образом, вы не получите обратную связь с вызовом Delete, за исключением исключения. Но предположим, что у вас есть файл, который периодически записывается или обновляется другим процессом:
file.Exists
. Там новый файл с тем же именем, что и возвращает true. Вы технически идете по неправильному пути.Этот точный сценарий может быть неверным для проблемы, которую вы в настоящее время пытаетесь решить, но проверка того, является ли вызов "Удалить" причиной исключения, гораздо более надежна, чем полагаться на вашу текущую реализацию.
Он не будет генерировать исключение, если файл не существует. В случае ошибки он будет генерировать исключение, если он не может быть удален, отметьте File.Delete
Вы всегда можете использовать
System.IO.File.Exists(path)
Хотя я согласен с Даниэлем, если Delete не генерирует исключение, вы должны быть хорошими.
В комментариях и предложениях вы должны использовать следующее, чтобы достичь желаемого результата.
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
}
Я обнаружил, что если вы используете метод экземпляра 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);
}