Tengo una carpeta:
c: \ prueba
Estoy probando este código:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
Obtengo una excepción:
El archivo ya existe
El directorio de salida definitivamente existe y el archivo de entrada está allí.
Tengo una carpeta:
c: \ prueba
Estoy probando este código:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
Obtengo una excepción:
El archivo ya existe
El directorio de salida definitivamente existe y el archivo de entrada está allí.
Respuestas:
Debe moverlo a otro archivo (en lugar de a una carpeta), esto también se puede usar para cambiar el nombre.
Moverse:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
Rebautizar:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\SomeFile2.txt");
La razón por la que dice "El archivo ya existe" en su ejemplo es porque C:\test\Test
intenta crear un archivo Test
sin una extensión, pero no puede hacerlo porque ya existe una carpeta con el mismo nombre.
Lo que necesitas es:
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");
Esto hará lo siguiente:
Editar: ¡Debería aclarar mi respuesta, aunque es la más votada! El segundo parámetro de File.Move debe ser el archivo de destino , no una carpeta. Está especificando el segundo parámetro como la carpeta de destino, no el nombre del archivo de destino, que es lo que requiere File.Move. Entonces, su segundo parámetro debería ser c:\test\Test\SomeFile.txt
.
Personalmente prefiero este método. Esto sobrescribirá el archivo en el destino, eliminará el archivo de origen y también evitará eliminar el archivo de origen cuando falla la copia.
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
más File.Move
?
Puede hacer un P / Invoke para MoveFileEx()
- pase 11 para 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);
O puedes simplemente llamar
Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(existingFileName, newFileName, true);
después de agregar Microsoft.VisualBasic como referencia.
Si el archivo realmente existe y desea reemplazarlo, use el siguiente código:
string file = "c:\test\SomeFile.txt"
string moveTo = "c:\test\test\SomeFile.txt"
if (File.Exists(moveTo))
{
File.Delete(moveTo);
}
File.Move(file, moveTo);
De acuerdo con los documentos de File.Move, no existe el parámetro "sobrescribir si existe". Intentaste especificar la carpeta de destino , pero debe proporcionar la especificación completa del archivo.
Al leer los documentos nuevamente ("brindando la opción de especificar un nuevo nombre de archivo"), creo que agregar una barra invertida a la especificación de la carpeta de destino puede funcionar.
Move(String, String, Boolean)
lugar. pero eso parece ser un error?
1) Con C # en .Net Core 3.0 y posteriores, ahora hay un tercer parámetro booleano:
ver 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) Para todas las demás versiones de .Net, https://stackoverflow.com/a/42224803/887092 es la mejor respuesta. Copie con Overwrite, luego elimine el archivo de origen. Esto es mejor porque lo convierte en una operación atómica. (He intentado actualizar MS Docs con esto)
Prueba Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(Source, Destination, True)
. El último parámetro es el conmutador Overwrite, que System.IO.File.Move
no tiene.
Si no tiene la opción de eliminar el archivo ya existente en la nueva ubicación, pero aún necesita moverlo y eliminarlo de la ubicación original, este truco de cambio de nombre podría funcionar:
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);
Esto asume el único '.' en el nombre del archivo está antes de la extensión. Divide el archivo en dos antes de la extensión, adjunta "_copy". entre. Esto le permite mover el archivo, pero crea una copia si el archivo ya existe o ya existe una copia de la copia, o existe una copia de la copia de la copia ...;)