使用 C# 中的 GZipStream 类对包含子目录的目录进行 Gzip 压缩?

发布于 2024-11-06 17:07:51 字数 166 浏览 5 评论 0原文

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

This MSDN site has an example to gzip a file. Then, how can I gzip a whole directory with sub directories in it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

甜妞爱困 2024-11-13 17:07:51

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

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

Since gzip only works on files, I suggest you tar your directory and then gzip the generated tar file.

You can use tar-cs or SharpZipLib to generate your tar file.

久夏青 2024-11-13 17:07:51

你不能!

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

You can't !

GZip was created for file, not directories :)

谁把谁当真 2024-11-13 17:07:51

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

gzip operates on a simgle stream. To create a multi-stream (multi-file) archive using the gzipstream you need to include your own index. Basicly, at its simplest you would write the file offsets to the beginning of the output stream and then when you read it back in you know where the boundaries are. This method would not be PKZIP compatible. To be compatible you would have to read and implement the ZIP format... or use something like SharpZip, or Zip.NET

秋意浓 2024-11-13 17:07:51

您可以在纯 .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/在带有系统 io-packaging 的 zip 文件内创建文件夹

You can zip the directory in pure .NET 3.0. Using SharpZipLib may not be desirable due to the modified GPL license.

First, you will need a reference to WindowsBase.dll.

This code will open or create a zip file, create a directory inside, and place the file in that directory. If you want to zip a folder, possibly containing sub-directories, you could loop through the files in the directory and call this method for each file. Then, you could depth-first search the sub-directories for files, call the method for each of those and pass in the path to create that hierarchy within the zip file.

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 could be an empty string, which would place the file directly in the zip.

Sources:
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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文