2010-06-14 15 views
10

Estoy copiando manualmente algunas carpetas y archivos a través de C#, y quiero mostrarle al usuario que algo realmente está sucediendo. Actualmente, el programa parece como si estuviera congelado, pero en realidad está copiando archivos.¿Mostrar un diálogo/formulario de copia de archivos mientras se copian archivos manualmente en C#?

Creo que ya existe un diálogo o formulario integrado que muestra el proceso, similar a copiar/mover archivos en el explorador de Windows. ¿Hay algo así disponible, o tendré que crear todo desde cero?

Además, ¿sería este el mejor método para mostrar al usuario que algo está sucediendo activamente?

¡Gracias por la ayuda!

Respuesta

22

Hay uno integrado en el espacio de nombres Microsoft.VisualBasic.FileIO. No dejes que el nombre te engañe, es un espacio de nombres muy subestimado para C#. La clase estática FileSystem tiene un método CopyFile y CopyDirectory que tiene esa capacidad.

FileSystem Members

prestar mucha atención a la UIOption tanto en los métodos y CopyFileCopyDirectory. Este emula muestra la ventana de copia de Windows Explorer.

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

Wow, realmente está infravalorado. Nunca he oído hablar de ese espacio de nombres. Tuve que crear un método recursivo para copiar un directorio y sus subdirectorios usando el espacio de nombres "Archivo". ¡Esto es mucho más simple! No tengo el paquete VB instalado para Visual Studio. Supongo que tendría que instalarlo para poder acceder al espacio de nombres, ¿sí? – Dinoo

+4

Es parte del framework .net. Simplemente agregue la referencia de Microsoft.VisualBasic a su proyecto y debería estar listo para comenzar. – jsmith

+0

Lo hice, pero desde ese espacio de nombres solo veo la clase "VBCodeProvider" de él. Actualizando VS con VB para ver si consigo más cosas. – Dinoo

0

Si usa un hilo BackgroundWorker, puede mostrar un diálogo de progreso. Tendrá que usar un hilo si no desea bloquear la interfaz de usuario.

El ejemplo en este MSDN page muestra cómo actualizar un indicador de progreso. En este caso, está en el formulario de solicitud principal, pero puede crear su propio diálogo para esto.

0

Esto depende de la experiencia del usuario que desee proporcionar. Puede usar las API de Windows para mostrar el cuadro de diálogo de copia estándar; sin embargo, creo que su aplicación aún parecerá no responder.

lo recomiendo algo como esto:

// 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(); 

Esto le permite utilizar su lógica de copia de archivos existentes, y todavía proporcionan una agradable interfaz de usuario de respuesta.

Cuestiones relacionadas