2012-09-26 3 views
2

다음 코드는 서버에서 파일을 다운로드하는 데 사용됩니다.이 파일은 텍스트 파일로 작동합니다. 이 코드는 MSDN 샘플에서 가져온 것입니다.ftp가 exe 및 dll 파일을 손상시킵니다 (C#)

public void DownloadFile(string serverPath, string localPath) 
     { 

      try 
      { 
       FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + serverPath); 

       request.Method = WebRequestMethods.Ftp.DownloadFile; 
       request.Credentials = new NetworkCredential(_domain + "\\" + _username, _password); 
       FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
       Stream responseStream = response.GetResponseStream(); 
       StreamReader reader = new StreamReader(responseStream); 
       string contents = reader.ReadToEnd(); 
       File.WriteAllText(localPath, contents); 

       reader.Close(); 
       response.Close(); 

      } 
      catch (WebException ex) 
      {     
       string exMsg = string.Empty; 


       //add more error codes    
       FtpWebResponse response = (FtpWebResponse)ex.Response; 
       MessageBox.Show(response.StatusCode.ToString()); 

       switch(response.StatusCode) { 
        case FtpStatusCode.NotLoggedIn: 
         exMsg = "wrong password"; 
         break; 

        case FtpStatusCode.ActionNotTakenFileUnavailable: 
         exMsg = "file you are trying to load is not found"; 
         break; 

        default: 
         exMsg = "The server is inaccessible or taking too long to respond."; 
         break; 
       } 

       throw new Exception(exMsg); 
      } 

      return; 
     } 

그러나 dll과 exe는 손상됩니다. 어떤 아이디어가 범인입니까?

+0

File.WriteAllText의 인코딩이 잘못되었을 수 있습니다. WriteAllText의 기본 인코딩은 utf8입니다. –

답변

2

StreamReader은 텍스트 데이터 (TextReader)를 읽으므로 이진 파일이 손상됩니다.

스트림에서 직접 읽어야합니다.

당신은 할 수 있어야한다 :

Stream responseStream = response.GetResponseStream(); 

// Don't read/write as text! 
// StreamReader reader = new StreamReader(responseStream); 
// string contents = reader.ReadToEnd(); 
// File.WriteAllText(localPath, contents); 

using (var output = File.OpenWrite(localPath)) 
{ 
    responseStream.CopyTo(output); 
} 

편집 :

Stream responseStream = response.GetResponseStream(); 
using (var output = File.OpenWrite(localPath)) 
{ 
    byte[] buffer = new byte[32768]; 
    int read; 
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write (buffer, 0, read); 
    } 
} 
+0

Stream에는 CopyTo() 함수가 없습니다. – sarsnake

+0

@sarsnake .NET 4.0 이상 (http://msdn.microsoft.com/en-us/library/dd782932.aspx) 3.5 또는 이전 버전 인 경우 http://stackoverflow.com/을 참조하십시오. a/230141/65358 –

+0

3.5를 사용하고 있습니다. 죄송합니다. 질문을 업데이트 드리겠습니다. – sarsnake

3

: 당신이 .NET 3.5을 사용하고 있기 때문에, 수동으로 스트림을 복사 할 수 있습니다

시도해보십시오.

request.UseBinary = true; 
관련 문제