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参数忽略,并不会影响内容。
SharpZipLib打.tar.gz压缩包的更多相关文章
- 代码片段 - Golang 创建 .tar.gz 压缩包
		Golang创建 .tar.gz 压缩包 tar 包实现了文件的打包功能,可以将多个文件或目录存储到单一的 .tar 文件中,tar 本身不具有压缩功能,只能打包文件或目录: import " ... 
- LinuxPAServer19.0.tar.gz压缩包
		LinuxPAServer19.0.tar.gz DELPHI XE10.2(TOKYO)开始可以编写LINUX控制台程序.在LINUX上面需要部署LinuxPAServer19.0.tar.gz,即 ... 
- 在Windows平台上利用CMD命令行来压缩和解压缩.tar.gz压缩包
		解压命令: tar -xzvf dwt.tar.gz -C tmp/ 上述命令将dwt.tar.gz压缩包解压到tmp/文件夹 压缩命令: tar -czvf dwt.tar.gz dwt/ 上述命令 ... 
- CentOs下mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz压缩包的安装
		之前写过一篇mysql在windows下的安装(猛击这儿),linux下用的比较少,最近切换到linux服务器了,发行mysql安装和windows下有所不同,只记录压缩包方式安装,rpm包类似 1. ... 
- 通过maven-assembly-plugin将Springboot项目打包成tar.gz压缩包,在Linux环境可执行脚本直接安装成系统服务
		1.在pom.xml中添加maven-assembly-plugin依赖,同时需将默认生成的spring-boot-maven-plugin依赖删除,否则最终打出的发行包启动会有问题 <plug ... 
- Ubuntu 12.10 安装 jdk-7u10-linux-x64.tar.gz(转载)
		在Ubuntu 12.10下安装 jdk-7u10-linux-x64.tar.gz 总的原则:将jdk-7u10-linux-x64.tar.gz压缩包解压至/usr/lib/jdk,设置jdk环境 ... 
- Windows如何压缩tar.gz格式
		Windows如何压缩tar.gz格式 tar.gz 是linux和unix下面比较常用的格式,几个命令就可以把文件压缩打包成tar.gz格式 然而这种格式在windows并不多见,WinRAR.Wi ... 
- ubuntu12.04安装tar.gz格式的jdk
		注意系统的版本,jdk也有32位和64位的,不然会无效 首先将*.tar.gz压缩包解压 命令: tar -xzvf *.tar.gz 假设得到的文件夹为java 将其移动到/usr/中 命令为:su ... 
- Windows下压缩成tar.gz格式
		tar.gz 是linux和unix下面比较常用的格式,几个命令就可以把文件压缩打包成tar.gz格式,然而这种格式在windows并不多见,WinRAR.WinZip等主流压缩工具可以释放解开,却不 ... 
- windows系统下压缩文件成tar.gz格式的方法
		tar.gz 是linux和unix下面比较常用的格式,几个命令就可以把文件压缩打包成tar.gz格式,然而这种格式在windows并不多见,WinRAR.WinZip等主流压缩工具可以释放解开,却不 ... 
随机推荐
- Opensack-T版脚本安装
			openStack-train 搭建部署 项目环境: 主机名 外网口(net) 内口(仅主机)s 配置 controller 192.168.220.10/192.168.220.1/24 192.1 ... 
- Angular 16+ 高级教程 – Angular 和其它技术方案的比较
			前言 上一篇我有提到 Angular 适合用于哪些项目,但讲的太含糊,什么大中小项目的...这篇我将更具体的去讲解,Angular 的定位,还有它和其它方案的优缺点. Web 技术可以用来做许许多多不 ... 
- RxJS 系列 – Utility Operators
			前言 前几篇介绍过了 Creation Operators Filtering Operators Join Creation Operators Error Handling Operators T ... 
- 前后端沟通 naming conversion 转换需要知道的事
			c# 是 pascal case, js 是 camel case 所以在做 web api 和 odata 的时候经常需要转换. 早年 web api 是依赖 Newtonsoft json (JS ... 
- Rust字符串类型全解析
			字符串是每种编程语言都绕不开的类型, 不过,在Rust中,你会看到远比其他语言更加丰富多样的字符串类型. 如下图: 为什么Rust中需要这么多种表示字符串的类型呢? 初学Rust时,可能无法理解为什么 ... 
- Sqoop简介安装及使用
			Sqoop简介 sqoop 是 apache 旗下一款"Hadoop 和关系数据库服务器之间传送数据"的工具. 核心的功能有两个: 导入.迁入 导出.迁出 导入数据:MySQL,O ... 
- 61.null和undefined的区别
			null 是空指针,用来保存准备使用的对象,但是现在还没有,用来占位 : undefined 是未定义,是声明了变量但是没有初始化 : 
- 使用 KubeKey 在 AWS 高可用部署 Kubernetes
			作者:李耀宗 介绍 对于生产环境,我们需要考虑 Kubernetes 集群的高可用性.本文教您部署如何在多台 AWS EC2 实例快速部署一套高可用的生产环境.要满足 Kubernetes 集群服务需 ... 
- 一次彻底讲清如何处理mysql 的死锁问题
			MySQL 死锁 是指两个或多个事务互相等待对方持有的锁,从而导致所有事务都无法继续执行的现象.在 InnoDB 存储引擎中,死锁是通过锁机制产生的,特别是在并发较高.业务逻辑复杂的情况下,更容易发生 ... 
- SpringBoot 2.3 升级到 SpringBoot 2.7 爬坑-- SpringDoc & Swagger
			目录 POM yml 配置自定义的 OpenAPI 规范 拦截器去除 swagger 的接口验证 模型 Controller 配置 常用注解 注意:Swagger支持SpringBoot2.0但不支持 ... 
