Pregunta Mover archivos en diferentes volúmenes en .NET


Aparentemente no puedo mover archivos en diferentes volúmenes usando Directory.Move.

He leído que tengo que copiar cada archivo individualmente al destino y luego eliminar el directorio de origen.

¿Tengo alguna otra opción?


5
2017-12-18 16:35


origen


Respuestas:


Independientemente de si Directory.Move (o cualquier otra función) realizó el movimiento entre volúmenes, básicamente estaría haciendo una copia y eliminando de todos modos debajo. Entonces, si quieres un aumento de velocidad, eso no va a suceder. Creo que la mejor solución sería escribir su propia función de movimiento reutilizable, que obtendría la etiqueta de volumen (C:, D :) de las rutas hacia y desde, y luego realizar un movimiento o copiar + eliminar cuando sea necesario.


6
2017-12-18 16:49



Por lo que sé, no hay otra forma, sin embargo, eliminar un directorio tiene un problema: los archivos de solo lectura pueden provocar una excepción No Autorizada de Acceso de Acceso 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);
        }
    }

esto recursó un directorio y desactivó todas las banderas de solo lectura. Llamar antes de Directory.Delete :)


4
2017-12-18 16:58



Una opción más fácil sería, para agregar una referencia a la Microsoft.VisualBasic espacio de nombres y usar el MoveDirectory método, que puede moverse a través de volúmenes.

Microsoft.VisualBasic.FileIO.FileSystem.MoveDirectory(sourceDirName, destDirName);

2
2017-07-14 09:27



Intenta 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ás la función CopyDirectoryRecursive aquí:

Esto debería estar funcionando hasta que uses volumen abarcado o enlaces de símbolos a otro disco físico.

Para ser aún más robusto, puede mejorar esta función para usar Mover hasta que se lanza System.IO .Exception y luego cambiar a copiar y eliminar.


0
2017-07-04 06:03