2008-10-08 50 views
19

我知道有libraries out there for working with ZIP files。而且,您可以选择use the functionality built into Windows for working ZIP files如何使用System.IO.Compression读取/写入ZIP文件?

但是,我想知道是否有人已经研究出如何使用.NET内的System.IO.Compression命名空间内置的工具读取/写入ZIP文件?或者,仅仅使用这个命名空间是不可能的?

更新:我似乎有人评论说,System.IO.Packaging命名空间也可能是有用的。有谁知道如何做到这一点?

回答

15

使用ZipPackage类,MSDN具有完整的examplehttp://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx。需要.NET 3.5。

+5

实际上,`System.IO.Packaging`-命名空间包含用于使用Open Packaging样式包的类。你可以用它来创建ZIP文件(如果你不关心一些额外的文件将被包含在你的ZIP中),但它不能用于打开任何* zip文件。请参阅[ZipPackage类文档的底部](http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage(v = vs.85).aspx)以获取更多信息(此社区不是存在于.NET 4.0文档中,但仍然有效)。 – larsmoa 2012-03-16 12:50:34

0

是的,我以前用过它。我分类DataSet一次支持坚持到一个文件(通过ReadXML/WriteXML方法)。作为额外的好处,如果需要,我决定允许它被压缩(这一点,正如你应该已经知道的那样,对XML等文本数据非常有效)。

我使用了GZipStream类(当时我的理解是,相关的DeflateStream仅仅是没有头文件信息的GZip,或者我确信有人能纠正我)。它的工作原理很简单,就是在另一个流的顶部搭载,因此您可以在其位置使用GZipStream。在我的情况下,它是在FileStream上捎带的。

给定一个MemoryStream到充满的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); 
} 

Save()Pump()简单方法如下所示:

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

您的解决方案不会读取或写入ZIP文件格式,而只是针对原始缩放压缩或GZip简单页眉页脚扩展来执行放缩压缩。 – 2008-10-09 00:02:51

6

你会想要使用第三方库,如http://www.codeplex.com/DotNetZip,而不是尝试使用GZipStream或DeflateStream来读取zip文件。

.NET中的*** Stream类可让您读取或写入压缩的字节流。这些类不读取或写入zip文件。压缩文件是由“信封”或标题包围的压缩数据。把它看作元数据 - 它包括文件的名称,时间戳,CRC和其他一些东西。 ** Stream类仅生成压缩数据流,不知道如何生成或使用元数据,这在PKWare维护的PKZip格式规范中进行了描述。

DotNetZip等第三方库处理ZIP档案中的元数据。他们可能会或可能不会使用System.IO.Compression.DeflateStream()类来产生压缩的字节流。例如,在以前的版本中,DotNetZip使用内置的DeflateStream。截至v1。如图7所示,DotNetZip包含了自己的DeflateStream,它比.NET Framework中的DeflateStream更有效率。另外一个好处是,DotNetZip中的嵌入式DeflateStream允许在.NET Compact Framework 2.0上使用DotNetZip,它缺少System.IO.Compression.DeflateStream。 (它是在Compact Framework 3.5中添加的)

如果您有更多的问题,DotNetZip网站上有一个很好的论坛。 实例C#代码:

try 
    { 
     using (ZipFile zip = new ZipFile()) 
     { 
      zip.AddDirectory(DirectoryToZip); // recurses subdirs 
      zip.Save(Filename); 
     } 
    } 
    catch (System.Exception ex1) 
    { 
     System.Console.Error.WriteLine("exception: " + ex1); 
    } 
0
public static void zIpDatabseFile(string srcPath, string destPath) 
    {//This is for Zip a File 
     using (var source = new FileStream(srcPath, FileMode.Open, FileAccess.Read, FileShare.Read)) 
     using (var dest = new FileStream(destPath, FileMode.OpenOrCreate, FileAccess.Write)) 
     using (var zip = new GZipStream(dest, CompressionMode.Compress)) 
     { 
      source.CopyTo(zip); 
     } 
    } 
    public static void uNzIpDatabaseFile(string SrcPath, string DestPath) 
    {// This is for unzip a files. 
     using (var source = new FileStream(SrcPath, FileMode.Open, FileAccess.Read, FileShare.Read)) 
     using (var dest = new FileStream(DestPath, FileMode.OpenOrCreate, FileAccess.Write)) 
     using (var zip = new GZipStream(source, CompressionMode.Decompress)) 
     { 
      zip.CopyTo(dest); 
     } 
    } 
5

由于.NET 4.5,微软已经提供了ZipArchive类的System.IO.Compression命名空间。与该命名空间中的其他类不同,尽管如GZipStreamDeflate流,ZipArchive需要引用System.IO.Compression.dll程序集。

使用起来相当简单,上面的MSDN链接提供了一些很好的例子。

此外,微软已经创建了Microsoft Compression NuGet package,这增加了对ZipArchive和支持,相关类到Windows Phone 8和其它便携式类库

3

一个旧的线程,我知道,但我想指出的是。 NET 4.5增加了对system.io.compression的大量改进。它现在可以很好地处理.zip文件,甚至可以将zip文件中的单个文件公开为流或者读写,而不需要提取和压缩文件。