Ich habe einen Ordner:
c: \ test
Ich versuche diesen Code:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
Ich bekomme eine Ausnahme:
Die Datei existiert bereits
Das Ausgabeverzeichnis existiert definitiv und die Eingabedatei ist da.
Ich habe einen Ordner:
c: \ test
Ich versuche diesen Code:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
Ich bekomme eine Ausnahme:
Die Datei existiert bereits
Das Ausgabeverzeichnis existiert definitiv und die Eingabedatei ist da.
Antworten:
Sie müssen es in eine andere Datei (anstatt in einen Ordner) verschieben. Dies kann auch zum Umbenennen verwendet werden.
Bewegung:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
Umbenennen:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\SomeFile2.txt");
In Ihrem Beispiel heißt es "Datei existiert bereits", weil C:\test\Test
versucht wird, eine Datei Test
ohne Erweiterung zu erstellen , dies jedoch nicht möglich ist, da bereits ein Ordner mit demselben Namen vorhanden ist.
Was Sie brauchen ist:
if (!File.Exists(@"c:\test\Test\SomeFile.txt")) {
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
}
oder
if (File.Exists(@"c:\test\Test\SomeFile.txt")) {
File.Delete(@"c:\test\Test\SomeFile.txt");
}
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
Dies wird entweder:
Bearbeiten: Ich sollte meine Antwort klarstellen, obwohl es die am besten bewertete ist! Der zweite Parameter von File.Move sollte die seine Zieldatei - nicht einen Ordner. Sie geben den zweiten Parameter als Zielordner an , nicht den Zieldateinamen - was File.Move erfordert. Ihr zweiter Parameter sollte also sein c:\test\Test\SomeFile.txt
.
Persönlich bevorzuge ich diese Methode. Dadurch wird die Datei auf dem Ziel überschrieben, die Quelldatei entfernt und das Entfernen der Quelldatei verhindert, wenn die Kopie fehlschlägt.
string source = @"c:\test\SomeFile.txt";
string destination = @"c:\test\test\SomeFile.txt";
try
{
File.Copy(source, destination, true);
File.Delete(source);
}
catch
{
//some error handling
}
File.Copy , File.Delete
vor File.Move
?
Sie können ein P / Invoke durchführen, MoveFileEx()
um 11 für flags
( MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH
) zu übergeben.
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
static extern bool MoveFileEx(string existingFileName, string newFileName, int flags);
Oder Sie können einfach anrufen
Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(existingFileName, newFileName, true);
nach dem Hinzufügen von Microsoft.VisualBasic als Referenz.
Wenn die Datei wirklich vorhanden ist und Sie sie ersetzen möchten, verwenden Sie den folgenden Code:
string file = "c:\test\SomeFile.txt"
string moveTo = "c:\test\test\SomeFile.txt"
if (File.Exists(moveTo))
{
File.Delete(moveTo);
}
File.Move(file, moveTo);
Gemäß den Dokumenten für File.Move gibt es keinen Parameter "Überschreiben, falls vorhanden". Sie haben versucht, den Zielordner anzugeben , müssen jedoch die vollständige Dateispezifikation angeben .
Beim Lesen der wieder docs ( „die Möglichkeit , die Bereitstellung eines neuen Dateinamen angeben“), ich denke , kann arbeiten , um einen umgekehrten Schrägstrich in den Zielordner spec hinzufügen.
Move(String, String, Boolean)
stattdessen an. aber das scheint ein fehler zu sein?
1) Mit C # auf .Net Core 3.0 und höher gibt es jetzt einen dritten booleschen Parameter:
Siehe https://docs.microsoft.com/en-us/dotnet/api/system.io.file.move?view=netcore-3.1
In .NET Core 3.0 and later versions, you can call Move(String, String, Boolean) setting the parameter overwrite to true, which will replace the file if it exists.
2) Für alle anderen Versionen von .Net ist https://stackoverflow.com/a/42224803/887092 die beste Antwort. Kopieren Sie mit Überschreiben und löschen Sie die Quelldatei. Dies ist besser, weil es eine atomare Operation ist. (Ich habe versucht, die MS Docs damit zu aktualisieren)
Versuchen Sie es Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(Source, Destination, True)
. Der letzte Parameter ist der Overwrite-Schalter, der System.IO.File.Move
nicht vorhanden ist.
Wenn Sie nicht die Option haben, die bereits vorhandene Datei am neuen Speicherort zu löschen, aber dennoch verschoben und vom ursprünglichen Speicherort gelöscht werden müssen, funktioniert dieser Umbenennungstrick möglicherweise:
string newFileLocation = @"c:\test\Test\SomeFile.txt";
while (File.Exists(newFileLocation)) {
newFileLocation = newFileLocation.Split('.')[0] + "_copy." + newFileLocation.Split('.')[1];
}
File.Move(@"c:\test\SomeFile.txt", newFileLocation);
Dies setzt das einzige '.' im Dateinamen steht vor der Erweiterung. Es teilt die Datei vor der Erweiterung in zwei Teile und fügt "_copy" hinzu. zwischen. Auf diese Weise können Sie die Datei verschieben, aber eine Kopie erstellen, wenn die Datei bereits vorhanden ist oder eine Kopie der Kopie bereits vorhanden ist oder eine Kopie der Kopie der Kopie vorhanden ist ...;)