File.Move завершается ошибкой, когда ему предшествует File.Delete - PullRequest
12 голосов
/ 18 апреля 2011

У нас есть метод MoveFile, который обычно работает, но на сайте клиента происходит сбой.

if (File.Exists(target))
{
    File.Delete(target);
}

File.Move(source, target);

Вызов File.Move неоднократно завершается с

System.IO.IOException: Cannot create a file when that file already exists.

   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.__Error.WinIOError()
   at System.IO.File.Move(String sourceFileName, String destFileName)

У нас есть ошибка обработки вызова этого метода, но мы не можем понять, почему File.Delete не работает и ничего не выдает.

Мы хоть и о разрешении файла, но тогда File.Delete должен был бы выбросить UnauthorizedAccessException.

Существуют ли какие-либо другие причины, по которым File.Move мог бы завершиться ошибкой с "файлом уже существует", когда ему предшествует удаление этого конкретного файла?

Ответы [ 5 ]

12 голосов
/ 18 апреля 2011

Можете ли вы изменить логику?

File.Copy (source, target, true) 

чтобы перезаписать цель, тогда

File.Delete(source)
4 голосов
/ 18 апреля 2011

Я полагаю, что это может произойти, если у кого-то еще есть файл, открытый с опцией FileShare.Delete (т.е. разрешить удаление).В таком случае файл будет помечен для удаления, но фактически не будет удален, пока не будет закрыт другой дескриптор.

Я не уверен, какие процессы могут открыть файл таким способом -антивирусное программное обеспечение будет одной из возможностей.

4 голосов
/ 18 апреля 2011

В прошлом я обнаружил, что система имеет тенденцию удалять файл «медленнее», чем ваша программа.

В идеале вам нужно проверить, был ли файл удален, прежде чемпереместить файл на свое место.Обычно вы можете обойти это с помощью простого Thread.Sleep (200) или аналогичного, но это, вероятно, не самый надежный способ!

3 голосов
/ 18 апреля 2011

Я думаю, вы можете получить лучшие результаты из:

System.IO.File.Copy(sourceFileName, destFileName, overwrite);

так что overwrite = true

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

Затем вы можете удалить оригинал по мере необходимости.

0 голосов
/ 28 июня 2014

Вот еще лучший способ избежать копирования или опроса удаления ---
Давайте предположим, что у нас есть File_A и File_B. Мы хотим переместить File_B поверх File_A.
Шаги:
1) Переименуйте (переместите) File_A в третье имя, File_C.
2) Удалить файл_C.
3) Переименуйте (переместите) Файл_B в Файл_A.

File.Move("File_A", "File_C");
File.Delete("File_C");
File.Move("File_B", "File_A");

Это устраняет состояние гонки, когда исходный удаляемый файл зависает, пока новый файл перемещается в исходный файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...