Pau*_*els 3 c# ftp ftpwebrequest ftpwebresponse
我正在使用以下代码从远程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();
}
Run Code Online (Sandbox Code Playgroud)
我正在下载的文件是一个DLL,我的问题是它以某种方式被这个过程改变了.我知道这是因为文件大小正在增加.我怀疑这部分代码是错误的:
destination.Write(reader.ReadToEnd());
destination.Flush();
Run Code Online (Sandbox Code Playgroud)
任何人都可以提出任何可能出错的想法吗?
Qua*_*ter 11
StreamReader并StreamWriter使用字符数据,因此您将流从字节解码为字符,然后再将其编码回字节.dll文件包含二进制数据,因此这种往返转换会引入错误.您希望直接从responseStream对象读取字节并写入FileStream未包含在的对象中StreamWriter.
如果您使用的是.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);
}
}
Run Code Online (Sandbox Code Playgroud)
所以,你的代码将如下所示:
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
using (FileStream destination = File.Create(destinationFile))
{
CopyStream(responseStream, destination);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3693 次 |
| 最近记录: |