我正在使用以下代码从远程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 对象并写入 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);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top