Файл будет отсутствовать в случае сбоя приложения между File.Delete и File.Move.Могу ли я этого избежать?
Не то, что я знаю, но вы можете обнаружить это - и если вы используете более предсказуемое имя файла, вы можете восстановить его.Это помогает, если вы немного подправите процесс, чтобы использовать три имени файла: цель, «новый» файл и «старый» файл.Процесс становится следующим:
- Запись в «новый» файл (например,
foo.txt.new
) - Переименование целевого файла в «старый» файл (например,
foo.txt.old
) - Переименуйте «новый» файл в целевой файл
- Удалите «старый» файл
У вас есть три файла, каждый из которых может присутствовать или отсутствовать.Это может помочь вам обнаружить ситуацию, когда вы читаете новый файл:
- Нет файлов: пока ничего не записано
- Просто цель: Все хорошо
- Назначение и новый: сбой приложения при записи нового файла
- Назначение и старый: приложению не удалось удалить старый файл
- Новое и старое: сбой приложения после первого переименования, но перед вторым
- Все три, или просто старые, или просто новые: происходит нечто очень странное!Возможно, пользователь вмешался
Примечание. Раньше я не знал о File.Replace
, но подозреваю, что эффективно - просто более простой и, возможно, более эффективный способ выполнения кода, который выуже делаю.(Это здорово - используйте его!) Хотя процесс восстановления будет таким же.