gpt4 book ai didi

c# - FtpWebRequest 下载文件大小不正确

转载 作者:行者123 更新时间:2023-11-30 13:34:22 25 4
gpt4 key购买 nike

我正在使用以下代码从远程 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 对象读取字节并写入未包装在 StreamWriter 中的 FileStream

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

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

关于c# - FtpWebRequest 下载文件大小不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3196226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com