14 Stimmen

File.Move schlägt fehl, wenn ein File.Delete vorausgegangen ist

Wir haben eine MoveFile-Methode, die normalerweise funktioniert, aber bei einem Kunden immer wieder fehlschlägt.

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

File.Move(source, target);

Die Aufforderung an File.Move schlägt wiederholt fehl mit

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)

Wir haben eine Fehlerbehandlung für den Aufruf dieser Methode, aber wir können nicht herausfinden, warum File.Delete funktioniert nicht und wirft nichts aus.

Wir dachten an die Dateiberechtigung, aber dann kam die File.Delete würde einen UnauthorizedAccessException .

Gibt es noch andere Gründe, die dafür sprechen File.Move mit der Meldung "Datei ist bereits vorhanden" fehlschlagen, wenn zuvor eine bestimmte Datei gelöscht wurde?

14voto

MarcE Punkte 3516

Können Sie die Logik umkehren?

File.Copy (source, target, true) 

um das Ziel zu überschreiben, dann

File.Delete(source)

4voto

Daniel Frear Punkte 1449

In der Vergangenheit habe ich festgestellt, dass das System dazu neigt, die Datei "langsamer" zu löschen, als Ihr Programm läuft.

Im Idealfall müssen Sie prüfen, ob die Datei gelöscht wurde, bevor Sie versuchen, eine Datei an ihre Stelle zu setzen. Normalerweise können Sie dies mit einem einfachen Thread.Sleep(200) oder ähnlichem umgehen, aber das ist wahrscheinlich nicht die zuverlässigste Methode!

4voto

Joe Punkte 117971

Ich glaube, dass dies passieren kann, wenn jemand anderes die Datei mit der Option FileShare.Delete geöffnet hat (d.h. das Löschen erlaubt). In einem solchen Fall wird die Datei zwar zum Löschen markiert, aber erst gelöscht, wenn das andere Handle geschlossen wird.

Ich bin mir nicht sicher, welche Prozesse eine Datei auf diese Weise geöffnet haben könnten - Antivirus-Software wäre eine Möglichkeit.

3voto

Cos Callis Punkte 4995

Ich denke, dass Sie damit bessere Ergebnisse erzielen könnten:

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

so dass overwrite = true

wird die alte Datei überschrieben, falls sie vorhanden ist, anstatt sich um das separate Löschen der Datei zu kümmern.

Sie können das Original dann nach Bedarf löschen.

1voto

pmont Punkte 2033

Hier ist ein noch besserer Weg, der das Kopieren oder Abfragen des Löschens vermeidet ---
Nehmen wir an, wir haben Datei_A und Datei_B. Wir wollen Datei_B über Datei_A verschieben.
Schritte:
1) Benennen Sie Datei_A um (verschieben Sie sie) und geben Sie ihr einen dritten Namen, Datei_C.
2) Löschen Sie Datei_C.
3) Umbenennen (Verschieben) von Datei_B nach Datei_A.

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

Dadurch wird die Wettlaufsituation beseitigt, bei der die zu löschende Originaldatei hängen bleibt, während die neue Datei in die Originaldatei verschoben wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X