Domanda

A quanto pare non posso spostare i file su volumi diversi che utilizzano Directory.Move.

Ho letto che devo copiare ogni singolo file alla destinazione, quindi eliminare la directory di origine.

Devo qualunque altra opzione?

È stato utile?

Soluzione

A prescindere dal fatto che Directory.Move (o qualsiasi altra funzione) eseguita la mossa fra i volumi, sarebbe essere essenzialmente facendo una copia ed eliminare in ogni caso al di sotto. Quindi, se volete un aumento di velocità, questo non succederà. Penso che la soluzione migliore sarebbe quella di scrivere la propria funzione riutilizzabile mossa, che otterrebbe l'etichetta di volume (C:., D :) dal da e per i percorsi, e poi o eseguire una mossa, o copiare + cancellare, se necessario

Altri suggerimenti

Per quanto ne so non c'è altro modo però l'eliminazione di una directory ha un fermo: solo leggere i file potrebbe causare un Greeve UnauthorizedAccessException durante l'eliminazione di una directory e tutto il suo contenuto

 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);
        }
    }

questo recurses una directory e disinserisce tutte le bandiere di sola lettura. Chiamare prima Directory.Delete:)

Una scelta più facile sarebbe, per aggiungere un riferimento allo spazio dei nomi Microsoft.VisualBasic e utilizzare il metodo MoveDirectory, che può muoversi attraverso i volumi.

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

Prova ad usare questo:

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);
    }
}

Troverete CopyDirectoryRecursive funzione qui :

Questo dovrebbe funzionare fino a quando si utilizza attraversato il volume o il simbolo si collega a un altro disco fisico.

Per essere ancora più robusta si può migliorare questa funzione per utilizzare muoversi fino System.IO .Exception è gettato e poi per passare alla copiatura e cancellazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top