2011-10-25 21 views
8

Estoy creando un programa de copia de archivo que copiará una gran cantidad de archivos (~ 100,000) con un tamaño ~ 50 KB usando el comando ROBOCOPY.Copia de archivo usando robo copy y proceso

Para cada archivo, estoy creando un nuevo proceso y pasar el comando ROBOCOPY y los argumentos de la siguiente manera:

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

En lugar de crear un proceso para cada archivo, Busco a un mejor enfoque, que se ser bueno en términos de rendimiento y diseño. ¿Alguien puede sugerir un método mejor?

+1

¿Por qué no debería simplemente usar el método File.Copy()? –

+0

¿Cuáles son sus requisitos? Robocopy tiene muchas funciones (multihebra, reanudación, reintentos, etc.), ¿cuáles son las que le interesan? – RedFilter

+0

¿Hay algún motivo en particular por el que esté utilizando RoboCopy? – Marco

Respuesta

3

Yo solo usaría System.IO. Debe ser lo suficientemente rápido, y su nombre de archivo podría ser un comodín.

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 es muy lento en comparación con ROBOCOPY. ¿Derecha? –

+0

Probablemente no considerando cómo se plantea la pregunta original. Descender a un proceso y esperarlo probablemente sea más lento en general. Teniendo en cuenta algunos de los otros comentarios, puede que aún desee considerar realizar File.Copy, pero sea creativo en la forma en que activa el proceso de copia. Posiblemente considere usar un hilo separado para hacer la copia sin supervisión. –

+3

Su respuesta no es útil ya que File.copy no tiene todas las características de robocopy. por ejemplo: soporte de Longpath – Honorificabilitudinitas

2

Debe llamar al File.Copy en un bucle.

+0

Y si no quiere bloquear el hilo principal, podría hacer este trabajo en un hilo separado (tal vez un ' BackgroundWorker') que notifica a UI ... – Marco

0

.cmd tiene siguientes líneas

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 

Cuando corro> Robocopy sample.cmd I comienza con 4 ventanas múltiples copiar archivos al mismo tiempo como por los comandos anteriores, se espera de otro archivo, como se tiene tiempo de espera, si el archivo está siendo utilizado por otro proceso. Es más más rápido que trabajo simultáneamente.

Ahora estoy desarrollando GUI usando C# Windows para ejecutar el proceso en lugar de ir al comando de la consola y
inicio

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

Sin embargo, si se toma el control de un proceso, es decir, en cmd.exe y y hay 4 procesos robocopy en taskmanager. cuando se completa el proceso cmd.exe, devuelve el cursor a label.text "Exitosamente finalizado". Si bien aún hay procesos robocopy en ejecución. Puede ver las ventanas robocopy haciendo el proceso de copiado.

aquí está la pregunta: Quiero tomar el control de todos los procesos (cmd.exe y robocopy.exe) mediante programación en C#, por lo que cuando el label.text debe mostrar "completado con éxito" sólo cuando todos los comandos se completan con éxito ", si uno falla, entonces no hay ningún punto en la GUI.

opción 2 (similar a Biju ha escrito anteriormente): es mejor eliminar los comandos de comando robocopy de sample.cmd (archivo por lotes) file y write code para ejecutar las 4 líneas robocopy en C#, pero cómo ejecutar la línea de script rococooy escrita .cmd file, ya que también tienen argumentos. I code ejecuta cada proceso robocopy luego cada uno Volverá a la siguiente línea de código y, si falla, podemos detectar el error y mostrar en el cuadro de mensaje.

Espero que esto ayude ... Sin embargo, estoy buscando una forma mejor, si alguien puede mejorar la misma.

+1

@ user2045570 ¿Por qué no eliminaste las líneas vacías mientras estás en ello? –

+0

@TobiasKienzler debe haberse perdido. Velará por las líneas vacías la próxima vez. – nedaRM

9

Esta pregunta es un poco antigua, pero pensé que respondería para ayudar a cualquiera que todavía aterrice en ella. Escribí una biblioteca llamada RoboSharp (https://github.com/tjscience/RoboSharp) que trae todas las bondades en Robocopy a C#. Eche un vistazo si necesita el poder de Robocopy en C#.

+1

¡Impresionante! Hace todo lo que he estado buscando! – 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