File.Move завершается ошибкой, когда ему предшествует File.Delete

У нас есть метод 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 завершится с ошибкой «файл уже существует», если ему предшествует удаление этого конкретный файл?

c# io
12 голосов | спросил Pierre-Alain Vigeant 18 PMpMon, 18 Apr 2011 19:11:05 +040011Monday 2011, 19:11:05

5 ответов


0

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

File.Copy (source, target, true) 

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

File.Delete(source)
ответил MarcE 18 PMpMon, 18 Apr 2011 19:35:32 +040035Monday 2011, 19:35:32
0

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

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

ответил Daniel Frear 18 PMpMon, 18 Apr 2011 19:12:41 +040012Monday 2011, 19:12:41
0

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

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

ответил Joe 18 PMpMon, 18 Apr 2011 19:27:31 +040027Monday 2011, 19:27:31
0

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

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

чтобы overwrite = true

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

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

ответил Cos Callis 18 PMpMon, 18 Apr 2011 19:33:57 +040033Monday 2011, 19:33:57
0

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

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

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

ответил pmont 28 J0000006Europe/Moscow 2014, 02:42:54

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132