FtpWebRequest下载文件不正确的大小

我正在使用以下代码从远程ftp服务器下载文件:

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(); 

任何人都可以提出任何可能出错的想法吗?

StreamReaderStreamWriter使用字符数据,因此您将流从字节解码为字符,然后再将其编码回字节。 dll文件包含二进制数据,因此这种往返转换会引入错误。 您希望直接从responseStream对象读取字节并写入未包含在StreamWriterFileStream

如果您使用的是.NET 4.0,则可以使用Stream.CopyTo ,否则您将不得不手动复制流。 这个StackOverflow问题有一个很好的复制流的方法:

 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); }