2012-09-26 87 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); 
} 

编辑:

由于您使用.NET 3.5,您可以手动复制流:

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/zh-cn/library/dd782932.aspx)如果您使用的是3.5或更低版本,请参阅:http://stackoverflow.com/ a/230141/65358 –

+0

我使用3.5,对不起,我会更新问题 – sarsnake

3

试试看:

request.UseBinary = true;