2010-07-07 3 views
3
I 원격 FTP 서버에서 파일을 다운로드하려면 다음 코드를 사용하고

:에서는 FtpWebRequest 파일 다운로드 잘못된 크기

 FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath); 

     request.KeepAlive = true; 
     request.UsePassive = true; 
     request.UseBinary = true; 

     request.Method = WebRequestMethods.Ftp.DownloadFile; 
     request.Credentials = new NetworkCredential(userName, password);     

     using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) 
     using (Stream responseStream = response.GetResponseStream()) 
     using (StreamReader reader = new StreamReader(responseStream)) 
     using (StreamWriter destination = new StreamWriter(destinationFile)) 
     { 
      destination.Write(reader.ReadToEnd()); 
      destination.Flush(); 
     } 

나는 다운로드가 dll을하고 내 문제가되고 있다는 것이다 해요 파일 어떤면에서이 과정에 의해 변경되었습니다. 파일 크기가 커지므로이 사실을 알고 있습니다. 이 코드 섹션에 오류가 있다는 의문이 있습니다.

 destination.Write(reader.ReadToEnd()); 
     destination.Flush(); 

잘못된 정보가있을 수있는 사람이 있습니까?

답변

11

StreamReaderStreamWriter은 문자 데이터로 작동하므로 바이트에서 문자로 스트림을 디코딩 한 다음 다시 바이트로 인코딩합니다. dll 파일에는 바이너리 데이터가 포함되어 있으므로이 왕복 변환에서 오류가 발생합니다. responseStream 개체에서 직접 바이트를 읽고 StreamWriter에 래핑되지 않은 FileStream에 쓰려고합니다.

.NET 4.0을 사용하는 경우 Stream.CopyTo을 사용할 수 있지만 그렇지 않으면 스트림을 수동으로 복사해야합니다.

public static void CopyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[32768]; 
    while (true) 
    { 
     int read = input.Read(buffer, 0, buffer.Length); 
     if (read <= 0) 
      return; 
     output.Write(buffer, 0, read); 
    } 
} 

그래서, 당신의 코드는 다음과 같이 표시됩니다 :

using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) 
using (Stream responseStream = response.GetResponseStream()) 
using (FileStream destination = File.Create(destinationFile)) 
{ 
    CopyStream(responseStream, destination); 
} 
This StackOverflow question는 복사 스트림을위한 좋은 방법이있다
관련 문제