ftpwebrequest下载文件不正确的大小
-
02-10-2019 - |
题
我正在使用以下代码从远程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();
谁能对可能出问题的任何想法提出任何想法?
解决方案
StreamReader
和 StreamWriter
使用字符数据,因此您将流从字节解码到字符,然后再次编码为字节。 DLL文件包含二进制数据,因此此往返转换将引入错误。您想直接从 responseStream
对象并写入 FileStream
那不是包裹在 StreamWriter
.
如果使用.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);
}
不隶属于 StackOverflow