gpt4 book ai didi

c# - 无法通过 HTTP 响应从文件下载创建 DotNetZip ZipFile

转载 作者:行者123 更新时间:2023-11-30 15:32:15 27 4
gpt4 key购买 nike

我正在尝试通过 url 下载 zip 文件以从中提取文件。我宁愿不必将它保存为临时文件(工作正常),而是将其保存在内存中 - 它不是很大。例如,如果我尝试下载此文件:

http://phs.googlecode.com/files/Download%20File%20Test.zip

使用此代码:

using Ionic.Zip;
...
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

if (response.ContentLength > 0)
{
using (MemoryStream zipms = new MemoryStream())
{
int bytesRead;
byte[] buffer = new byte[32768];

using (Stream stream = response.GetResponseStream())
{
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
zipms.Write(buffer, 0, bytesRead);

ZipFile zip = ZipFile.Read(stream); // <--ERROR: "This stream does not support seek operations. "
}

using (ZipFile zip = ZipFile.Read(zipms)) // <--ERROR: "Could not read block - no data! (position 0x00000000) "
using (MemoryStream txtms = new MemoryStream())
{
ZipEntry csentry= zip["Download File Test.cs"];
csentry.Extract(txtms);
txtms.Position = 0;
using (StreamReader reader = new StreamReader(txtms))
{
string csentry = reader.ReadToEnd();
}
}
}
}
...

注意我在哪里标记了我收到的错误。对于第一个,它不喜欢 System.Net.ConnectStream。如果我将该行注释掉并允许它命中我注意到第二个错误的行,它不喜欢 MemoryStream。我确实看到了这个帖子:https://stackoverflow.com/a/6377099/1324284但是我遇到了其他人提到的关于没有超过 4 个 Read 方法重载的问题,所以我无法尝试 WebClient。

但是,如果我通过 FileStream 执行所有操作并首先将其保存到临时位置,然后将 ZipFile.Read 指向该临时位置,则一切正常,包括将任何包含的文件提取到 MemoryStream 中。

感谢您的帮助。

最佳答案

您需要Flush() 您的MemoryStream 并在读取之前将Position 设置为0,否则您正在尝试读取从当前位置(什么都没有)。

对于您的代码:

ZipFile zip;
using (Stream stream = response.GetResponseStream())
{
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
zipms.Write(buffer, 0, bytesRead);
zipms.Flush();
zipms.Position = 0;
zip = ZipFile.Read(zipms);
}

关于c# - 无法通过 HTTP 响应从文件下载创建 DotNetZip ZipFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19402303/

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