SharpZipLib打.tar.gz压缩包

.tar.gz是linux上常见的压缩格式,linux默认支持这种压缩格式,所以我们经常见到在linux系统上的.tar.gz包。


这里我们说一下怎么用SharpZipLib来打一个.tar.gz的压缩包。

using System;
using System.IO;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Tar;


private void CreateTarGZ(string tgzFilename, string sourceDirectory)
{
    Stream outStream = File.Create(tgzFilename);
    Stream gzoStream = new GZipOutputStream(outStream);
    TarArchive tarArchive = TarArchive.CreateOutputTarArchive(gzoStream);

    // 这里我们需要定义一下RootPath
    tarArchive.RootPath = sourceDirectory.Replace('\\', '/');
    if (tarArchive.RootPath.EndsWith("/"))
        tarArchive.RootPath = tarArchive.RootPath.Remove(tarArchive.RootPath.Length - 1);

    AddDirectoryFilesToTar(tarArchive, sourceDirectory, true);

    tarArchive.Close();
}

private void AddDirectoryFilesToTar(TarArchive tarArchive, string sourceDirectory, bool recurse)
{
    // 这里如果是文件夹,就直接写入。
    TarEntry tarEntry = TarEntry.CreateEntryFromFile(sourceDirectory);
    tarArchive.WriteEntry(tarEntry, false);

    // 查找文件夹下面的所有文件写入
    string[] filenames = Directory.GetFiles(sourceDirectory);
    foreach (string filename in filenames)
    {
        tarEntry = TarEntry.CreateEntryFromFile(filename);
        tarArchive.WriteEntry(tarEntry, true);
    }

    if (recurse)
    {
        string[] directories = Directory.GetDirectories(sourceDirectory);
        foreach (string directory in directories)
            AddDirectoryFilesToTar(tarArchive, directory, recurse);
    }
}

使用方法:

CreateTarGZ(@"c:\temp\gzip-test.tar.gz", @"c:\data");

这里解释一下RootPath的作用。

我们都知道一个压缩包里的目录结构其实都是相对路径,但是我们往里面写的时候写的文件名都是绝对路径。那么压缩包从什么目录开始作为作为相对路径的开始目录呢?这就是RootPath的作用。

RootPath之前的路径在制作压缩包的时候都会被舍弃,之后的目录结构会保留。


关键的一句在于TarEntry.CreateEntryFromFile,直接把路径传入即可生成一个TarEntry,然后通过tarArchive.WriteEntry(tarEntry, false);TarEntry放入我们的TarArchive中。


这里注意,SharpZipLib生成的.tar.gz包在linux上解压时可能会报警告,因为SharpZipLib在生成压缩包的时候增加了一些填充字符,需要解压的时候增加-q参数忽略,并不会影响内容。

posted @   jvx  阅读(1363)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示