Ho una cartella:
c: \ test
Sto provando questo codice:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
Ottengo un'eccezione:
Il file esiste già
La directory di output esiste sicuramente e il file di input è lì.
Ho una cartella:
c: \ test
Sto provando questo codice:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
Ottengo un'eccezione:
Il file esiste già
La directory di output esiste sicuramente e il file di input è lì.
Risposte:
È necessario spostarlo in un altro file (anziché in una cartella), questo può anche essere utilizzato per rinominare.
Mossa:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
Rinominare:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\SomeFile2.txt");
Il motivo per cui nel tuo esempio viene visualizzato "File già esistente" è perché C:\test\Testtenta di creare un file Testsenza estensione, ma non può farlo perché esiste già una cartella con lo stesso nome.
Quello che ti serve è:
if (!File.Exists(@"c:\test\Test\SomeFile.txt")) {
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
}
o
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");
Questo può:
Modifica: dovrei chiarire la mia risposta, anche se è la più votata! Il secondo parametro di File.Move dovrebbe essere il file di destinazione , non una cartella. Stai specificando il secondo parametro come cartella di destinazione, non il nome del file di destinazione, che è ciò che File.Move richiede. Quindi, il tuo secondo parametro dovrebbe essere c:\test\Test\SomeFile.txt.
Personalmente preferisco questo metodo. Ciò sovrascriverà il file nella destinazione, rimuoverà il file di origine e impedirà anche di rimuovere il file di origine quando la copia non riesce.
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.Deleteoltre File.Move?
Puoi fare un P / Invoke per MoveFileEx()passare 11 per flags( MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH)
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
static extern bool MoveFileEx(string existingFileName, string newFileName, int flags);
Oppure puoi semplicemente chiamare
Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(existingFileName, newFileName, true);
dopo aver aggiunto Microsoft.VisualBasic come riferimento.
Se il file esiste davvero e desideri sostituirlo, utilizza il codice seguente:
string file = "c:\test\SomeFile.txt"
string moveTo = "c:\test\test\SomeFile.txt"
if (File.Exists(moveTo))
{
File.Delete(moveTo);
}
File.Move(file, moveTo);
1) Con C # su .Net Core 3.0 e versioni successive, ora è disponibile un terzo parametro booleano:
vedere 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) Per tutte le altre versioni di .Net, https://stackoverflow.com/a/42224803/887092 è la risposta migliore. Copia con Sovrascrivi, quindi elimina il file di origine. Questo è meglio perché lo rende un'operazione atomica. (Ho tentato di aggiornare MS Docs con questo)
Secondo la documentazione per File.Move non esiste un parametro "sovrascrivi se esiste". Hai provato a specificare la cartella di destinazione , ma devi fornire la specifica completa del file.
Leggendo di nuovo i documenti ("fornendo l'opzione per specificare un nuovo nome di file"), penso che l' aggiunta di una barra rovesciata alle specifiche della cartella di destinazione possa funzionare.
Move(String, String, Boolean)invece. ma sembra che sia un errore?
Prova Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(Source, Destination, True). L'ultimo parametro è l'opzione Sovrascrivi, che System.IO.File.Movenon ha.
Se non hai la possibilità di eliminare il file già esistente nella nuova posizione, ma devi comunque spostarlo ed eliminarlo dalla posizione originale, questo trucco di ridenominazione potrebbe funzionare:
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);
Questo presuppone l'unico "." nel nome del file è prima dell'estensione. Divide il file in due prima dell'estensione, allega "_copy". nel mezzo. Questo ti consente di spostare il file, ma crea una copia se il file esiste già o una copia della copia esiste già, o una copia della copia della copia esiste ...;)