Gzip 一个目录,该目录具有使用 GZipStream 类和 C# 的子目录

本文关键字:GZipStream 类和 子目录 一个 Gzip | 更新日期: 2023-09-27 17:56:23

此 MSDN 站点有一个 gzip 文件的示例。那么,如何压缩包含子目录的整个目录?

Gzip 一个目录,该目录具有使用 GZipStream 类和 C# 的子目录

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

您可以使用tar-cs或SharpZipLib来生成tar文件。

你不能!

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

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

可以在纯 .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