Mover archivos en volúmenes diferentes en .NET
-
22-08-2019 - |
Pregunta
Al parecer, no me puedo mover archivos en volúmenes diferentes que utilizan Directory.Move.
He leído que tengo que copiar cada archivo de forma individual al destino, a continuación, elimine el directorio de origen.
¿Tengo alguna otra opción?
Solución
Independientemente de si o no Directory.Move (o cualquier otra función) realiza el movimiento entre los volúmenes, que en esencia sería hacer una copia y borrar todos modos por debajo. Así que si quieres un aumento de velocidad, eso no va a suceder. Creo que la mejor solución sería la de escribir su propia función reutilizable movimiento, que obtendría la etiqueta de volumen (C:., D :) Del hacia y desde los caminos, y luego o bien realizar un movimiento, o copiar + borrar cuando sea necesario
Otros consejos
Que yo sepa no hay ninguna otra manera, sin embargo la eliminación de un directorio tiene un inconveniente: Leer archivos de sólo podría causar una Greeve UnauthorizedAccessException al eliminar un directorio y todo su contenido
public void removeReadOnlyDeep(string directory)
{
string[] files = Directory.GetFiles(directory);
foreach (string file in files)
{
FileAttributes attributes = File.GetAttributes(file);
if ((attributes & FileAttributes.ReadOnly) != 0)
{
File.SetAttributes(file, ~FileAttributes.ReadOnly);
}
}
string[] dirs = Directory.GetDirectories(directory);
foreach (string dir in dirs)
{
removeReadOnlyDeep(dir);
}
}
este recursivamente un directorio y desarma todas las únicas banderas leer. Llamar antes de Directory.Delete:)
Una opción más fácil sería, para agregar una referencia al espacio de nombres Microsoft.VisualBasic
y utilizar el método MoveDirectory
, que puede moverse a través de los volúmenes.
Microsoft.VisualBasic.FileIO.FileSystem.MoveDirectory(sourceDirName, destDirName);
Trate de usar esto:
public static void RobustMove(string sourceDirectory, string destDirectory)
{
//move if directories are on the same volume
if (Path.GetPathRoot(source) == Path.GetPathRoot(destination))
{
Directory.Move(source, destination);
}
else
{
CopyDirectoryRecursive(source, destination);
Directory.Delete(source, true);
}
}
Encontrará CopyDirectoryRecursive función aquí :
Esto debería estar trabajando hasta que utilice volumen distribuido o símbolo une a otro disco físico.
Para ser aún más robusto que puede mejorar esta función para utilizar Mover hasta System.IO .Exception es lanzada y luego cambiar a copiar o borrar.