Question

Apparemment, je ne peux pas déplacer des fichiers sur des volumes différents en utilisant Directory.Move.

J'ai lu que je dois copier chaque fichier individuellement à la destination, puis supprimez le répertoire source.

Dois-je une autre option?

Était-ce utile?

La solution

Peu importe si oui ou non Directory.Move (ou toute autre fonction) effectué le déplacement entre les volumes, il serait essentiellement faire une copie et de suppression de toute façon au-dessous. Donc, si vous voulez une augmentation de la vitesse, qui ne va pas se produire. Je pense que la meilleure solution serait d'écrire votre propre fonction de déplacement réutilisable, qui obtiendrait l'étiquette de volume (C:., D :) du vers et à partir des chemins, puis soit effectuer un mouvement ou copier + supprimer si nécessaire

Autres conseils

A ma connaissance il n'y a pas d'autre moyen mais la suppression d'un répertoire a un hic: fichiers en lecture seule peut provoquer une Greeve de UnauthorizedAccessException lors de la suppression d'un répertoire et de son contenu

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

récursif un répertoire et tous les met à l'arrêt lu que des drapeaux. Appel avant Directory.Delete:)

Une option plus facile serait, d'ajouter une référence à l'espace de noms Microsoft.VisualBasic et utiliser la méthode MoveDirectory, qui peut se déplacer sur plusieurs volumes.

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

Essayez d'utiliser ceci:

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

Vous trouverez la fonction CopyDirectoryRecursive ici :

Cela devrait travailler jusqu'à ce que vous utilisez enjambé volume ou symbole liens vers un autre disque physique.

Pour vous pouvez encore plus robuste améliorer cette fonction à utiliser jusqu'à ce que System.IO Déplacer .Exception est jeté et passer à la copie et la suppression.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top