2008-12-18 6 views

Répondre

6

Indépendamment du fait que Directory.Move (ou toute autre fonction) effectuait ou non le déplacement entre les volumes, il procédait essentiellement à une copie et à une suppression de toute façon en dessous. Donc, si vous voulez une augmentation de la vitesse, cela ne va pas arriver. 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 :) à partir des chemins de et vers, puis effectuer un déplacement, ou copier + supprimer si nécessaire.

4

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

ce récursif un répertoire et Rétablit tous les drapeaux en lecture seule. Appelez avant Directory.Delete :)

1

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

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

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 here:

Cela devrait fonctionner jusqu'à ce que vous utilisez spanned volume ou des liens symboliques vers un autre disque physique.

Pour être encore plus robuste, vous pouvez améliorer cette fonction pour utiliser Move jusqu'à ce que System.IO .Exception soit lancé, puis passer à la copie et à la suppression.

Questions connexes