使用C#DotNetZip在内存中提取zip文件失败
我正在尝试下载并解压缩C#中的zip文件,特别是DotNetZip 当我运行此代码时使用C#DotNetZip在内存中提取zip文件失败,c#,zip,dotnetzip,C#,Zip,Dotnetzip,我正在尝试下载并解压缩C#中的zip文件,特别是DotNetZip 当我运行此代码时 HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(reportUrl); HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse(); Stream stream = response.GetResponseStr
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(reportUrl);
HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
Stream stream = response.GetResponseStream();
MemoryStream ms = new MemoryStream();
stream.CopyTo(ms);
ms.Seek(0, 0);
ZipInputStream zip = new ZipInputStream(ms);
zip.Seek(0, 0);
ZipEntry e = zip.GetNextEntry();
string s = e.FileName;
MemoryStream ms2 = new MemoryStream();
e.Extract(ms2);
执行Extract方法后,我得到
$exception {"Object reference not set to an instance of an object."} System.Exception {System.NullReferenceException}
有什么想法吗?谢谢
很难说为什么代码不起作用。我将首先简化它,并确保我正确处理所有可支配资源,如流:
class Program
{
static void Main()
{
var url = "http://downloads.sourceforge.net/project/junit/junit/3.8.1/junit3.8.1.zip";
using (var client = new WebClient())
using (var zip = ZipFile.Read(client.DownloadData(url)))
{
foreach (var entry in zip)
{
entry.Extract(".");
}
}
}
}
请确保您签出了使用DotNetZip库的文档。我的直接想法是InputStream为空。您尝试了使用不同的memorystream实例吗?您所说的“Extract方法执行后”是什么意思?它在抛出异常之前是否正确执行?提取后的下一行代码是什么?好吧,我想知道InputStream是否也为null,但我无法找出ZipInputStream的构造中有什么错误会导致这种情况。我不确定它是否应该是什么,因为我的印象是一个ZipEntry已经从创建它的流中复制了它的数据。@Ethan,函数结束了。很抱歉不清楚,Extract方法抛出异常。嘿,谢谢你的回答,Darin!但是,这并不适合我(.NET4.0,DotNetZip的最新版本)。我不想依靠我不存在的C#来破坏你的答案。。。从Byte.Array(DownloadData return value)到IO.Stream(读取命令所需)的最佳方式是什么???@Charles Offenbacher,您遇到了什么错误?因为我刚刚在我的Win7 x64 VS2010.NET 4.0上测试了这段代码,它运行得非常好。ZipFile.Read似乎只接受文件名字符串或流…奇怪的是,我也在VS2010.NET 4.0 Win7 x64上…嗯。。。1秒。@Charles Ofenbacher,
ZipFile.Read有许多重载。为了方便起见,在我的示例中,我使用了一个字节数组,因为这恰好是从client.DownloadData
方法返回的。我看到了与Charles相同的错误,我刚刚通过nuget安装了DotNetZip。出于某种原因,我只看到4个重载,它们都希望流作为输入。