2010-06-14 16 views
10

Sto copiando manualmente alcune cartelle e file tramite C# e voglio mostrare all'utente che qualcosa sta effettivamente accadendo. Attualmente, il programma sembra come se fosse congelato, ma in realtà sta copiando i file.Mostra una finestra di dialogo/forma di copia dei file durante la copia manuale dei file in C#?

Penso che ci sia già una finestra di dialogo o un modulo incorporato che mostra il processo, simile alla copia/spostamento di file in Windows Explorer. C'è qualcosa del genere disponibile, o dovrò creare tutto da zero?

Inoltre, questo sarebbe il metodo migliore per mostrare all'utente che qualcosa sta accadendo attivamente?

Grazie per l'aiuto!

risposta

22

C'è un costruito in dalla Microsoft.VisualBasic.FileIO Namespace. Non lasciatevi ingannare dal nome, è uno spazio dei nomi molto sottovalutato per C#. La classe statica FileSystem ha un metodo CopyFile e CopyDirectory con tale capacità.

FileSystem Members

prestare molta attenzione alla UIOption in entrambi i metodi CopyFile e CopyDirectory. Questo emula visualizza la finestra di copia di Windows Explorer.

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

Wow, è davvero sottovalutato. Non ho mai sentito parlare di questo spazio dei nomi. Ho dovuto creare un metodo ricorsivo per copiare una directory e le sue sottodirectory usando lo spazio dei nomi "File". Questo è molto più semplice! Non ho installato il pacchetto VB per Visual Studio. Suppongo che dovrei installarlo per ottenere l'accesso allo spazio dei nomi, sì? – Dinoo

+4

Fa parte del framework .net. Basta aggiungere il riferimento Microsoft.VisualBasic al tuo progetto e dovresti essere pronto. – jsmith

+0

L'ho fatto, ma da quel namespace vedo solo la classe "VBCodeProvider" da esso. Aggiornamento VS con VB per vedere se ottengo più cose. – Dinoo

0

Se si utilizza un thread BackgroundWorker è possibile visualizzare una finestra di dialogo di avanzamento. Sarà necessario utilizzare un thread se non si desidera bloccare l'interfaccia utente.

L'esempio su questo MSDN page mostra come aggiornare un indicatore di stato. In questo caso è nel modulo di domanda principale, ma puoi creare la tua finestra di dialogo per questo.

0

Questo dipende dall'esperienza utente che si desidera fornire. È possibile utilizzare le API di Windows per mostrare la finestra di dialogo di copia standard; tuttavia, credo che la tua applicazione sembrerà ancora insensibile.

Mi raccomando qualcosa di simile:

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

Questo consente di utilizzare la logica di copia dei file esistenti, e continuano ad offrire una bella interfaccia utente reattiva.

Problemi correlati