2

这个 MSDN站点有一个 gzip 文件的示例。那么,我怎样才能 gzip 一个包含子目录的整个目录呢?

4

4 回答 4

2

由于 gzip 仅适用于文件,因此我建议您 tar 目录,然后 gzip 生成的 tar 文件。

您可以使用tar-csSharpZipLib来生成您的 tar 文件。

于 2011-05-11T16:47:26.757 回答
0

你不能!

GZip 是为文件而不是目录创建的 :)

于 2011-05-11T16:30:59.750 回答
0

gzip 在一个单一的流上运行。要使用 gzipstream 创建多流(多文件)存档,您需要包含自己的索引。基本上,在最简单的情况下,您会将文件偏移量写入输出流的开头,然后当您将其读回时,您就会知道边界在哪里。此方法与 PKZIP 不兼容。为了兼容,您必须阅读并实现 ZIP 格式……或使用 SharpZip 或 Zip.NET 之类的东西

于 2011-05-11T16:33:35.420 回答
0

您可以在纯 .NET 3.0 中压缩目录。由于修改了 GPL 许可证,可能不希望使用 SharpZipLib。

首先,您需要对 WindowsBase.dll 的引用。

此代码将打开或创建一个 zip 文件,在其中创建一个目录,并将文件放在该目录中。如果你想压缩一个文件夹,可能包含子目录,你可以遍历目录中的文件并为每个文件调用这个方法。然后,您可以深度优先搜索文件的子目录,为每个文件调用方法并传入路径以在 zip 文件中创建该层次结构。

public void AddFileToZip(string zipFilename, string fileToAdd, string destDir)
{
    using (Package zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate))
    {
        string destFilename = "." + destDir + "\\" + Path.GetFileName(fileToAdd);
        Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative));
        if (zip.PartExists(uri))
        {
            zip.DeletePart(uri);
        }
        PackagePart part = zip.CreatePart(uri, "", CompressionOption.Normal);

        using (FileStream fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read))
        {
            using (Stream dest = part.GetStream())
            {
                CopyStream(fileStream, dest);
            }
        }
    }
}

destDir 可以是一个空字符串,它将文件直接放在 zip 中。

资料来源: https ://weblogs.asp.net/jongalloway/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib

https://weblogs.asp.net/albertpascual/creating-a-folder-inside-the-zip-file-with-system-io-packaging

于 2019-04-12T22:53:09.817 回答