.net 如何使用System.IO.Compression读取/写入ZIP文件?
我知道有。你也可以选择 但是,我想知道是否有人已经研究出如何使用.NET中内置在System.IO.Compression命名空间中的工具来读取/写入ZIP文件?或者,是否不可能仅使用此命名空间.net 如何使用System.IO.Compression读取/写入ZIP文件?,.net,compression,zip,.net,Compression,Zip,我知道有。你也可以选择 但是,我想知道是否有人已经研究出如何使用.NET中内置在System.IO.Compression命名空间中的工具来读取/写入ZIP文件?或者,是否不可能仅使用此命名空间 更新:似乎有人评论说System.IO.Packaging名称空间可能也适用于此。有人知道怎么做吗?MSDN有一个完整的使用ZipPackage类的方法。需要.NET 3.5。戴夫,非常好!!我不知道里面有 现在我知道要查找什么了,我找到了一篇文章,其中有一个关于如何使用它的小代码示例: 在一个相关的
更新:似乎有人评论说System.IO.Packaging名称空间可能也适用于此。有人知道怎么做吗?MSDN有一个完整的使用ZipPackage类的方法。需要.NET 3.5。戴夫,非常好!!我不知道里面有 现在我知道要查找什么了,我找到了一篇文章,其中有一个关于如何使用它的小代码示例:
在一个相关的注释中,我还发现它看起来非常容易使用。是的,我过去用过它。我对其进行了一次子分类,以支持将其自身持久化到一个文件(通过/method)。作为一个额外的好处,我决定允许它根据需要进行压缩(大家都应该知道,这对于XML这样的文本数据非常有效) 我使用了这个类(据我当时的理解,相关的只是没有标题信息的GZip,或者类似的东西——我相信有人可以纠正我的错误)。它的工作非常简单,只需在另一个流的顶部进行piggy backing,然后您就可以使用GZipStream来代替它。在我的例子中,它是在一个文件流上的背驮 给定一个要用
myDataSet.WriteXML()的输出填充的字段,我执行了如下操作:
if (CompressData)
{
// Write to memory
mStream = new MemoryStream();
Save(mStream);
mStream.Seek(0, SeekOrigin.Begin);
// Filter that through a GZipStream and then to file
fStream = new FileStream(Path.Combine(CacheFilePath, FileName + ".gz"),
FileMode.OpenOrCreate);
zipStream = new GZipStream(fStream, CompressionMode.Compress, true);
Pump(mStream, zipStream);
}
else
{
// Write straight to file
fStream = new FileStream(Path.Combine(CacheFilePath, FileName),
FileMode.OpenOrCreate);
Save(fStream);
}
private void Pump(Stream input, Stream output)
{
int n;
byte[] bytes = new byte[4096]; // 4KiB at a time
while ((n = input.Read(bytes, 0, bytes.Length)) != 0)
{
output.Write(bytes, 0, n);
}
}
public void Save(Stream stream)
{
AcceptChanges();
WriteXml(stream, XmlWriteMode.WriteSchema);
}
其中Save()
和Pump()
是如下简单方法:
if (CompressData)
{
// Write to memory
mStream = new MemoryStream();
Save(mStream);
mStream.Seek(0, SeekOrigin.Begin);
// Filter that through a GZipStream and then to file
fStream = new FileStream(Path.Combine(CacheFilePath, FileName + ".gz"),
FileMode.OpenOrCreate);
zipStream = new GZipStream(fStream, CompressionMode.Compress, true);
Pump(mStream, zipStream);
}
else
{
// Write straight to file
fStream = new FileStream(Path.Combine(CacheFilePath, FileName),
FileMode.OpenOrCreate);
Save(fStream);
}
private void Pump(Stream input, Stream output)
{
int n;
byte[] bytes = new byte[4096]; // 4KiB at a time
while ((n = input.Read(bytes, 0, bytes.Length)) != 0)
{
output.Write(bytes, 0, n);
}
}
public void Save(Stream stream)
{
AcceptChanges();
WriteXml(stream, XmlWriteMode.WriteSchema);
}
您将希望使用第三方库,例如,而不是尝试使用GZipStream或deflatesttream来读取zip文件
NET中的***流类可以让您读取或写入压缩的字节流。这些类不读取或写入zip文件。zip文件是由“信封”或标题包围的压缩数据。可以将其视为元数据—它包括文件名、时间戳、CRC和其他一些内容。**流类只生成压缩数据流,不知道如何生成或使用元数据,这在PKWare维护的PKZip格式规范中有描述
第三方库(如DotNetZip)在ZIP存档中处理元数据。他们可能会也可能不会使用System.IO.Compression.DeflateStream()类来生成压缩的字节流。例如,在以前的版本中,DotNetZip使用内置的DeflateStream。从v1.7开始,DotNetZip包含自己的DeflateStream,它比.NET Framework中提供的DeflateStream效率更高。另外一个好处是,DotNetZip中嵌入的DeflateStream允许在缺少System.IO.Compression.DeflateStream的.NET Compact Framework 2.0上使用DotNetZip。(它是在Compact Framework 3.5中添加的)
如果您有更多问题,DotNetZip网站上有一个很好的论坛。
示例C#代码:
自.NET4.5以来,Microsoft已将该类提供给System.IO.Compression
命名空间。但是,与该名称空间中的其他类不同,GZipStream
和Deflate
流,ZipArchive
需要对System.IO.Compression.dll程序集的引用
它使用起来相当简单,上面指向MSDN的链接提供了一些很好的示例
此外,Microsoft还创建了,它为Windows Phone 8和其他便携类库添加了对ZipArchive
和相关类的支持我知道这是一个较旧的线程,但我想指出的是.NET 4.5对system.io.compression做了大量改进。现在,它可以很好地处理.zip文件,甚至可以将zip中的单个文件公开为支持流或读写,而无需提取和压缩文件。您的解决方案不读取或写入zip文件格式,只需原始的deflate压缩,或者GZip简单的页眉-页脚扩展名(deflate compression)。+1您的答案可能不会创建ZIP文件,但它确实说明了如何使用System.IO.compression,这非常适合压缩SSI中的文件,因为SSI限制为.NET 2.0,并且很难使用外部库。实际上,System.IO.Packaging
-命名空间包含用于处理开放式打包样式包的类。您可以使用它来创建ZIP文件(如果您不关心将包含在ZIP中的一些额外文件),但它不能用于打开任何ZIP文件。有关更多信息,请参阅(此社区不在.NET 4.0文档中,但仍然有效)。