2010-06-14 7 views
10

Je copie manuellement certains dossiers et fichiers via C#, et je veux montrer à l'utilisateur que quelque chose se passe réellement. Actuellement, le programme semble comme s'il est gelé, mais il est en fait la copie de fichiers.Afficher une boîte de dialogue/formulaire de copie de fichiers lors de la copie manuelle de fichiers en C#?

Je pense qu'il existe déjà un dialogue intégré ou un formulaire qui montre le processus, similaire à copier/déplacer des fichiers dans Windows Explorer. Y a-t-il quelque chose comme cela disponible, ou devrais-je créer tout à partir de zéro?

Aussi, serait-ce la meilleure méthode pour montrer à l'utilisateur que quelque chose se passe activement?

Merci pour l'aide!

Répondre

22

Il en existe un intégré à partir de l'espace de noms Microsoft.VisualBasic.FileIO. Ne laissez pas le nom vous tromper, c'est un espace de noms très sous-estimé pour C#. La classe statique FileSystem a une méthode CopyFile et CopyDirectory qui a cette capacité.

FileSystem Members

Pay attention particulière à la UIOption dans les deux méthodes CopyFile et CopyDirectory. Cette émule affiche la fenêtre de copie de l'Explorateur Windows.

FileSystem.CopyFile(sourceFile, destinationFile, UIOption.AllDialogs); 
FileSystem.CopyDirectory(sourceDirectory, destinationDirectory, UIOption.AllDialogs); 
+0

Wow, c'est vraiment sous-estimé. Je n'ai jamais entendu parler de cet espace de noms. J'ai dû créer une méthode récursive afin de copier un répertoire et ses sous-répertoires en utilisant l'espace de noms "Fichier". C'est tellement plus simple! Je n'ai pas le package VB installé pour Visual Studio. Je suppose que je devrais l'installer pour avoir accès à l'espace de nom, oui? – Dinoo

+4

Cela fait partie du framework .net. Ajoutez simplement la référence Microsoft.VisualBasic à votre projet et vous devriez être prêt à partir. – jsmith

+0

Je l'ai fait, mais à partir de cet espace de noms, je ne vois que la classe "VBCodeProvider". Mise à jour VS avec VB pour voir si je reçois plus de choses. – Dinoo

0

Si vous utilisez un fil BackgroundWorker, vous pouvez afficher une boîte de dialogue de progression. Vous devrez utiliser un thread si vous ne souhaitez pas verrouiller l'interface utilisateur.

L'exemple sur ce MSDN page montre comment mettre à jour un indicateur de progression. Dans ce cas, c'est sur le formulaire de demande principal, mais vous pouvez créer votre propre boîte de dialogue pour cela.

0

Cela dépend de l'expérience utilisateur que vous souhaitez fournir. Vous pouvez utiliser les API Windows pour afficher la boîte de dialogue de copie standard. Cependant, je crois que votre application semblera toujours ne pas répondre.

je recommande quelque chose comme ceci:

// WPF 
System.Threading.Thread t = new System.Threading.Thread(() => 
{ 
    foreach(String file in filesToCopy) 
    { 
     // copy file here 

     // WPF UI Update 
     Dispatcher.BeginInvoke(() => 
     { 
      // progressBar Update 
     }); 
    }      
}); 

// WinForms 
System.Threading.Thread t = new System.Threading.Thread(() => 
{ 
    foreach(String file in filesToCopy) 
    { 
     // copy file here 

     // WinForms UI Update 
     Form1.BeginInvoke(() => 
     { 
      // progressBar Update 
     }); 
    }    
}); 

// in either case call 
t.Start(); 

Cela vous permet d'utiliser votre logique de copie de fichier existant, et encore fournir une interface utilisateur agréable réactif.

Questions connexes