2014-01-09 1 views
0

Windows 응용 프로그램 C#을 사용하여 내 서버에서 대용량 파일 (5GB ~ 50GB)을 내 외부 하드 디스크로 전송하려고합니다.C#으로 원격 서버에 큰 파일 복사

코드는 파일을 전송하는 데 사용 :

public void CopyFile(string source, string dest) 
    { 
     using (FileStream sourceStream = new FileStream(source, FileMode.Open)) 
     { 
      byte[] buffer = new byte[64 * 1024]; // Change to suitable size after testing performance 
      using (FileStream destStream = new FileStream(dest, FileMode.Create)) 
      { 
       int i; 
       while ((i = sourceStream.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        destStream.Write(buffer, 0, i); 
        //OnProgress(sourceStream.Position, sourceStream.Length); 
       } 
      } 
     } 
    } 

그러나이 코드의 문제는 (파일이 여전히 느린 속도로 전송 있지만) 응용 프로그램이 실행, 내 응용 프로그램이 그냥 놀았어요 때이다

원격 서버에서 큰 파일을 복사하는 더 좋은 방법이 있습니까? 당신이 윈폼을하고 있다면

+3

? 그것이이 문제에 도움이되지는 않지만 다시 구현할 필요는 없습니다. – Blorgbeard

+1

어쨌든 BackgroundWorker 또는 Thread에서 복사본을 만드는 것이 좋습니다. – Blorgbeard

+0

응용 프로그램의 어떤 유형 (WPF, WinForms, ASP.NET, Console)에서이 버전을 사용하고 있습니까? –

답변

1

차단 조작이고 전송이 완료 될 때까지 응용 프로그램이 차단되므로 현재 주 응용 프로그램 스레드 대신 별도의 스레드에서이 작업을 수행해야합니다. BackgroundWorker을 살펴보면 별도의 스레드에서 실행되며 진행 보고서를 편리하게 제공되는 메인 스레드로 되돌릴 수 있으며 진행률 표시 줄을 구현할 수도 있습니다.

+0

빠른 설명 주셔서 감사합니다. 나는 BackgroundWorker가 갈 길이라고 생각합니다. 다시 시도하고 당신에게 돌아갈 것입니다 –

+0

완벽하게 작동, 그냥 빠른 질문, 내가 두 번이 프로세스를 실행하면 2 가지 배경 작업이 있습니까? –

+1

내가 어떻게하는지 잘 모르겠지만'BackgroundWorker's가 두 개 이상 실행될 수 있습니다. – Leo

0

, 당신의 WHILE 루프에 넣고 :

Application.DoEvents(); 

그것은 더 이상 (동결)를 차단하지 않습니다.

+0

감사합니다. 그리고 for foreach 루프를 사용하여, 그것은 여전히 ​​응답하지 않습니다. 나는 그것을 잘못된 장소에두고 있습니까? (루프 시작 부분에 넣습니다.) –

+0

while ((i = sourceStream.Read (buffer, 0, buffer.Length))> 0) { Application.DoEvents(); //이리!!! destStream.Write (buffer, 0, i); //OnProgress(sourceStream.Position, sourceStream.Length); } –

+0

<--- 형식이 잘못되었습니다. 미안합니다. –

관련 문제