Frage

Anscheinend kann ich keine Dateien verschieben auf verschiedenen Volumes mit Directory.Move.

Ich habe gelesen, dass ich jede Datei einzeln zum Ziel kopieren, dann das Quellverzeichnis gelöscht werden.

Muss ich eine andere Wahl?

War es hilfreich?

Lösung

Unabhängig davon, ob oder nicht Directory.Move (oder jede anderen Funktion), um die Bewegung zwischen der Volumina durchgeführt, wäre es im Wesentlichen eine Kopie tun und trotzdem unterhalb löschen. Wenn Sie also eine Geschwindigkeitserhöhung wollen, geht das wird nicht passieren. Ich denke, die beste Lösung wäre, um Ihre eigene wieder verwendbaren Move-Funktion zu schreiben, die die Datenträgerbezeichnung (C erhalten würden.:, D :) aus der zu und von den Wegen und dann entweder eine Bewegung ausführen oder kopieren + löschen, wenn nötig

Andere Tipps

Meines Wissens gibt es keine andere Möglichkeit, ein Verzeichnis jedoch das Löschen hat einen Haken: Nur Lesen von Dateien einen UnauthorizedAccessException Greeve verursachen könnten, wenn ein Verzeichnis und alle Inhalte zu löschen

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

Dieses recurses ein Verzeichnis und führt zum Löschen all Nur-Lese-Flags. Rufen Sie vor Directory.Delete:)

Eine einfachere Möglichkeit wäre, einen Verweis auf den Namespace Microsoft.VisualBasic hinzuzufügen und die MoveDirectory Methode zu verwenden, die sich über Volumina bewegen kann.

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

Versuchen Sie, diese verwenden:

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

Sie werden CopyDirectoryRecursive Funktion finden hier :

Dies sollte funktionieren, bis Sie aufgespannte Volumen oder Symbol verbindet auf einen anderen physischen Datenträger.

Um noch robuster Sie diese Funktion verbessern können verschieben verwenden, bis System.IO .Exception geworfen wird und dann zum Kopieren und Löschen zu wechseln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top