Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何使用System.IO.Compression读取/写入ZIP文件?_.net_Compression_Zip - Fatal编程技术网

.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。戴夫,非常好!!我不知道里面有 现在我知道要查找什么了,我找到了一篇文章,其中有一个关于如何使用它的小代码示例: 在一个相关的

我知道有。你也可以选择

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


更新:似乎有人评论说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文档中,但仍然有效)。