Трассировка стека указывает на DeleteFile . Вы уверены, что путь для удаления действителен? Вы уверены, что файл существует? Я плохо помню, но я думаю, что файл Delete может выдать, если файл не найден - пожалуйста, проверьте пример в связанном описании метода MSDN - там есть IF-существует.
[РЕДАКТИРОВАТЬ: Извините, сегодня я немного устал, и я не прочитал ваш код должным образом. Очевидно, ваш код уже защищен от отсутствия файлов.]
Помимо возможной проблемы небытия, существует небольшая вероятность того, что здесь, но где-то еще в вашем коде есть что-то, что открыло файл и не закрыло его должным образом. В таком случае система будет считать, что файл используется (даже если этот «старый» дескриптор, открытый в другом месте, «забыт» и ожидает, пока его не скопирует GC), и никакие операции над этим файлом не будут успешными, если этот дескриптор фактически умирает.
Другое дело, что даже если вы используете / autodispose, операция все равно может завершиться неудачей, если вы попытаетесь вызвать метод несколько раз одновременно из разных потоков. С асинхронными шаблонами иногда бывает трудно заметить - тщательно проверьте, из каких точек кода вызывается этот метод, и подумайте, может ли это произойти, т.е. что в то же время обратный вызов GUI вызовет его, и, возможно, также некоторую фоновую операцию? Если это так, попробуйте обернуть использование дополнительно оператором блокировки. Если это помогает, это означает, что у вас есть проблемы с повторным входом.
edit: кто-то, в какой-то момент в далеком будущем, убьет меня за сотни правок ... но я все равно напишу :): Я думаю, что в общем случае вам не нужно удалять файл перед записью в Это. CreateFile не единственный, кто получает доступ к файлам. Проверьте OpenFile с mode = OpenOrCreate | Сократить или еще короче: mode = Create (см. Объяснения FileMode )