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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top