2011-10-25 3 views
8

Sto creando un programma di copia di file che copierà un numero elevato di file (~ 100.000) con dimensione ~ 50 KB utilizzando il comando ROBOCOPY.Copia di file tramite copia robo ed elaborazione

Per ogni file, sto creando un nuovo processo e passando il comando ROBOCOPY e gli argomenti come segue:

using (Process p = new Process) 
{ 
    p.StartInfo.Arguments = string.Format("/C ROBOCOPY {0} {1} {2}", 
      sourceDir, destinationDir, fileName); 
    p.StartInfo.FileName = "CMD.EXE"; 
    p.StartInfo.CreateNoWindow = true; 
    p.StartInfo.UseShellExecute = false;      
    p.Start(); 
    p.WaitForExit(); 
} 

Invece di creare un processo per ciascun file, sto cercando un approccio migliore, che sarà essere bravo in termini di prestazioni e design. Qualcuno può suggerire un metodo migliore?

+1

Perché non dovresti semplicemente utilizzare il metodo File.Copy()? –

+0

Quali sono i tuoi requisiti? Robocopy ha molte caratteristiche (multithreading, curriculum, tentativi, ecc.), Quali sono quelli che ti interessano? – RedFilter

+0

C'è un motivo particolare per cui stai usando RoboCopy? – Marco

risposta

3

Vorrei utilizzare System.IO. Dovrebbe essere abbastanza veloce e il tuo nome file potrebbe essere un jolly.

using System.IO; 
// snip your code... providing fileName, sourceDir, destinationDir 
DirectoryInfo dirInfo = new DirectoryInfo(sourceDir); 
FileInfo[] fileInfos = dirInfo.GetFiles(fileName); 
foreach (FileInfo file in fileInfos) 
{ 
    File.Copy(file.FullName, Path.Combine(destinationDir, file.Name), true); // overwrites existing 
} 
+4

File.Copy è molto lento rispetto a ROBOCOPY. Destra? –

+0

Probabilmente non considerando come si pone la domanda originale. Schizzare verso un processo e aspettarlo è probabilmente più lento nel complesso. Considerando alcuni degli altri commenti, potresti voler prendere in considerazione l'idea di eseguire File.Copy, ma essere creativo nel modo in cui esegui il processo di copia. Probabilmente prendere in considerazione l'utilizzo di un thread separato per eseguire la copia incustodita. –

+3

La tua risposta non è utile poiché File.copy non ha tutte le funzionalità di robocopy. per esempio: supporto Longpath – Honorificabilitudinitas

2

È necessario chiamare File.Copy in un ciclo.

+0

E se non vuole bloccare il thread principale, potrebbe fare questo lavoro in un thread separato (forse un ' BackgroundWorker') che notifica l'interfaccia utente ... – Marco

0

.cmd ha righe seguenti

Start ROBOCOY src dest a* b* c* /z /w:1 r:1 
Start ROBOCOY src dest d* e* f* g* /z /w:1 r:1 
Start ROBOCOY src dest h* K* P* Y* /z /w:1 r:1 
Start ROBOCOY src dest xry* srp* /z /w:1 r:1 

Quando eseguo> Robocopy sample.cmd I avvio con 4 più finestre contemporaneamente la copia dei file come per comandi di cui sopra, aspetta per un altro file, come ha tempo di attesa, se il file viene utilizzato da un altro processo. È più più veloce mentre fa il lavoro simultaneamente.

Ora sto sviluppando GUI utilizzando C# Windows per eseguire il processo, invece di andare a comandare console e
inizio

main() 
    { 
    process.start("path of sample.cmd") 
    process.waitforexit() 
    label.text=" sucessful copy" 
    } 

Tuttavia, se si prende il controllo di un unico processo, cioè cmd.exe e e ci sono 4 processi di robocopy nel task manager . al termine del processo cmd.exe, restituisce il cursore su label.text "Sucessfully completato". Mentre ci sono processi di robocopy ancora in esecuzione. puoi vedere le finestre di robocopy facendo il processo di copia.

ecco la domanda: voglio prendere il controllo di tutti i processi (cmd.exe e robocopy.exe) programmazione in C#, in modo che quando il Label.text dovrebbe visualizzare "completato con successo" solo quando tutti i comandi sono completati con successo ", se uno fallisce, quindi non c'è alcun punto nella GUI.

opzione 2 (simile a Biju ha scritto sopra): è meglio rimuovere gli script di comando di robocopy da sample.cmd (file batch) file e scrivere il codice per eseguire le 4 linee di robocopy in C#, ma come eseguire la riga di script robocooy scritta in formato .cmd, dato che hanno anche degli argomenti.Il codice esegue ogni processo di robocopy quindi ogni tornerà alla riga successiva del codice e se fallisce, possiamo rilevare l'errore e la visualizzazione di nella finestra del messaggio.

Spero che questo aiuti ... Tuttavia, sto cercando un modo migliore, se qualcuno può migliorare lo stesso.

+1

@ user2045570 Perché non hai rimosso le linee vuote mentre ci sei? –

+0

@TobiasKienzler deve averlo perso. La prossima volta guarderai le linee vuote. – nedaRM

9

Questa domanda è un po 'vecchia, ma ho pensato di rispondere per aiutare chiunque vi si trovi ancora. Ho scritto una libreria chiamata RoboSharp (https://github.com/tjscience/RoboSharp) che porta tutta la bontà di Robocopy in C#. Dai un'occhiata se hai bisogno della potenza di Robocopy in C#.

+1

Fantastico! Fa tutto quello che stavo cercando! – NielW

0
Process p = new Process(); 
p.StartInfo.Arguments = string.Format("/C Robocopy /S {0} {1}", "C:\\source", "C:\\destination"); 
p.StartInfo.FileName = "CMD.EXE"; 
p.StartInfo.CreateNoWindow = true; 
p.StartInfo.UseShellExecute = false; 
p.Start(); 
p.WaitForExit(); 

/C Robocopy -> this is a command to run robocopy 
/S -> This will help to copy sub folders as well as Files