2011-10-25 4 views
8

ROBOCOPY 명령을 사용하여 크기가 ~ 50KB 인 많은 파일 (~ 100,000)을 복사하는 파일 복사 프로그램을 만들고 있습니다. 각 파일에 대해 로보 복사 및 프로세스를 사용한 파일 복사

, 나는 새로운 프로세스를 생성하고 다음과 같이 ROBOCOPY 명령과 인수를 전달하고있다 :

, 내가 더 나은 접근하는 것입니다 찾고 있어요 대신에 각 파일에 대한 프로세스를 만드는
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(); 
} 

성능과 디자인면에서 뛰어나다. 누군가가 더 좋은 방법을 제안 할 수 있습니까?

+1

왜 File.Copy() 메서드를 사용하지 않으시겠습니까? –

+0

귀하의 요구 사항은 무엇입니까? Robocopy에는 많은 기능 (멀티 스레딩, 재개, 재시도 등)이 있습니다. – RedFilter

+0

RoboCopy를 사용하는 특별한 이유가 있습니까? – Marco

답변

3

그냥 System.IO를 사용합니다. 충분하게 빠르지 않으면 파일 이름이 와일드 카드 일 수 있습니다.

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

ROBOCOPY에 비해 File.Copy가 정말 느립니다. 권리? –

+0

아마도 원래의 질문이 제기 된 방법을 고려하지 않았을 것입니다. 프로세스에 셸링 (shelling)하고 기다리는 것이 전체적으로 느려질 수 있습니다. 다른 의견을 고려해 볼 때 File.Copy를 고려해 볼 수도 있지만 복사 프로세스를 시작하는 방법을 창의적으로 다루는 것이 좋습니다. 무인 복사를 위해 별도의 스레드를 사용하는 것이 좋습니다. –

+3

File.copy에는 robocopy의 모든 기능이 없기 때문에 대답은 유용하지 않습니다. 예 : Longpath support – Honorificabilitudinitas

2

File.Copy을 호출해야합니다.

+0

그리고 그가 주 스레드를 차단하고 싶지 않으면 그는이 작업을 별도의 스레드에서 할 수 있습니다 (아마도' BackgroundWorker') ... – Marco

0

.CMD가있는 Robocopy 내가,이 같은 다른 파일에 대한 대기 4 개 여러 개의 창을 동시에 위의 명령에 따라 파일 복사를 시작 을 sample.cmd> 다음 줄

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 

내가 실행하고있다 파일이 다른 프로세스에서 사용중인 경우에는 대기 시간이 있습니다. 동시에 더 많은 것이 일 때 더 빠릅니다. 그것은 하나 개의 프로세스의 제어, 즉 cmd.exe를하고 소요가있는 경우

는 지금은,

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

그러나 콘솔과
시작을 명령하는 것 대신에 프로세스를 실행 C#을 창을 사용하여 GUI를 개발하고 작업 관리자에서 의 4 robocopy 프로세스. cmd.exe 프로세스가 완료되면 label.text에 "Successfullyfully completed"라는 커서를 반환합니다. robocopy 프로세스가 계속 실행되는 동안. robocopy windows 복사 과정을 볼 수 있습니다. 여기

는 질문 다음 label.text 표시해야하는 경우 만 때 모든 명령을 "성공적으로 완료"그래서 내가 프로그래밍 방식으로 C#으로 을 모든 프로세스의 제어 (cmd.exe를하고 robocopy.exe)을 먹고 싶어 성공적으로 완료되었습니다 "라는 메시지가 나타나면 GUI에 아무런 문제가없는 경우

옵션 2 (위의 Biju와 유사) : sample.cmd (배치 파일)에서 robocopy 명령 스크립트를 제거하는 것이 좋습니다. 파일을 작성하고 C#에서 4 개의 robocopy 줄을 실행하는 코드를 작성하지만, 인수도 있으므로 robocooy 스크립트 행에 .cmd 파일을 작성하는 방법을 실행합니다. 각 코드는 robocopy를 실행합니다. 각 프로세스 다음 코드 행으로 돌아가고 실패하면 오류 및 표시를 메시지 상자에 catch 할 수 있습니다.

희망이 도움이 될 것입니다. 그러나 누군가가 똑같이 향상시킬 수 있다면 더 좋은 방법을 찾고 있습니다.

+1

@ user2045570 빈 줄을 지우지 않은 이유는 무엇입니까? –

+0

@TobiasKienzler가 놓친 것 같습니다. 다음에 빈 줄을 조심해. – nedaRM

9

이 질문은 조금 낡았지만 나는 여전히 그것에 착륙하는 사람을 도울 것이라고 생각했습니다. RobocSharp (https://github.com/tjscience/RoboSharp)라는 라이브러리를 작성하여 Robocopy의 모든 장점을 C#으로 가져 왔습니다. C#에서 Robocopy의 힘이 필요한지 살펴보십시오.

+1

굉장! 내가 찾던 모든 것을 해! – 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