20

我知道那里有用于处理 ZIP 文件的库。而且,您也可以使用 Windows 内置的功能来处理 ZIP 文件

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

更新:我似乎有人评论 System.IO.Packaging 命名空间也可能对此有用。有谁知道具体怎么做?

4

8 回答 8

17

MSDN 有一个使用 ZipPackage 类的完整示例 http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx 。需要 .NET 3.5。

于 2008-10-08T19:04:05.397 回答
7

戴夫,非常好!!我不知道那是在里面。

现在我知道要查找什么,我能够找到一篇关于如何使用它的小代码示例的文章: http ://weblogs.asp.net/jgalloway/archive/2007/10/25/creating-zip -archives-in-net-without-an-an-external-library-like-sharpziplib.aspx

在相关的说明中,我还发现DotNetZip 项目看起来非常易于使用。

于 2008-10-08T19:13:06.627 回答
7

您将希望使用第三方库,例如http://www.codeplex.com/DotNetZip,而不是尝试使用 GZipStream 或 DeflateStream 来读取 zip 文件。

.NET 中的 ***Stream 类可以让您读取或写入压缩的字节流。这些类不读取或写入 zip 文件。zip 文件是由“信封”或标题包围的压缩数据。将其视为元数据——它包括文件名、时间戳、CRC 和一堆其他内容。**Stream类只产生压缩数据流,不知道如何产生或消费元数据,这在PKWare维护的PKZip格式规范中有描述。

DotNetZip 等第三方库处理 ZIP 存档中的元数据。他们可能会也可能不会使用 System.IO.Compression.DeflateStream() 类来生成压缩的字节流。例如,在以前的版本中,DotNetZip 使用内置的 DeflateStream。从 v1.7 开始,DotNetZip 包含自己的 DeflateStream,它比 .NET Framework 中提供的更高效。作为一个额外的好处,DotNetZip 中的嵌入式 DeflateStream 允许 DotNetZip 在缺少 System.IO.Compression.DeflateStream 的 .NET Compact Framework 2.0 上使用。(它是在 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);
    }
于 2009-01-04T03:41:36.953 回答
6

从 .NET 4.5 开始,Microsoft 已将ZipArchive类提供给System.IO.Compression命名空间。但是,与该命名空间中的其他类不同,就像GZipStreamDeflate流一样,它ZipArchive 需要对 System.IO.Compression.dll程序集的引用。

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

此外,Microsoft 还创建了Microsoft Compression NuGet 包,它ZipArchive为 Windows Phone 8 和其他可移植类库添加了对相关类的支持

于 2013-11-15T16:45:31.923 回答
4

一个较旧的线程,我知道,但我想指出 .NET 4.5 对 system.io.compression 进行了广泛的改进。它现在可以很好地操作 .zip 文件,甚至可以将 zip 中的单个文件公开为能够读取和写入的流,而无需提取和压缩文件的步骤。

于 2015-02-04T23:03:21.223 回答
1

.NET Framework Zip / UnZip 工具使用打包命名空间

于 2008-10-08T19:46:16.120 回答
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);
}

WhereSave()Pump()are 简单的方法,如下所示:

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);
}
于 2008-10-08T19:46:39.053 回答
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);
        }
    }
于 2013-05-24T06:38:02.973 回答