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

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

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

有帮助吗?

解决方案

MSDN有一个完整的示例 < a href =“http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx”rel =“noreferrer”> http://msdn.microsoft.com/en-us/ library / system.io.packaging.zippackage.aspx 使用ZipPackage类。需要.NET 3.5。

其他提示

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

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

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

您需要使用第三方库,例如 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允许在.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);
    }

自.NET 4.5起,Microsoft提供了 ZipArchive 类到 System.IO.Compression 命名空间。但是,与该命名空间中的其他类不同,如 GZipStream Deflate 流, ZipArchive 需要对System.IO的引用。 Compression.dll 程序集。

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

此外,Microsoft还创建了 Microsoft Compression NuGet软件包,支持 ZipArchive 以及Windows Phone 8和其他可移植类库的相关类

我知道一个旧线程,但我想指出.NET 4.5对system.io.compression进行了大量改进。它现在可以很好地操作.zip文件,甚至可以将zip中的单个文件显示为具有流的能力或读写,而无需提取和压缩文件。

是的,我过去曾经用过它。我将 DataSet 分为一类,以支持自己的持久化到文件(通过 ReadXML ) / WriteXML 方法)。作为一个额外的好处,我决定允许它(如果需要的话)可选地进行压缩(这一点,正如大家应该已经知道的那样,对XML等文本数据非常有效)。

我使用了 GZipStream 课程(当时我的理解是相关的 DeflateStream 仅仅是没有标题信息的GZip,或者其他一些&#8212;我相信有人可以纠正我这个问题。它非常简单地通过捎带在另一个流的顶部,因此您可以在其位置使用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);
}
    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);
        }
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top