Linux上常用的压缩包格式是.tar.gz。.tar.gz文件的创建过程有两步。首先把文件打包到tar文件中,然后用gzip压缩tar文件。这里分享下如何在Windows上创建,解压,更新.tar.gz压缩包。

Linux命令

如果在Windows上安装了Linux子系统,可以用Linux命令。
创建.tar.gz

tar -czvf dwt.tar.gz dwt/

解压.tar.gz

tar -xzvf dwt.tar.gz -C tmp/

7zip命令

创建

7z a -ttar -so dwt.tar dwt/ | 7z a -si dwt.tar.gz

解压

7z x dwt.tar.gz -so | 7z x -si -ttar

更新比较复杂

7z x dwt.tar.gz && 7z u dwt.tar dwt && del dwt.tar.gz && 7z a dwt.tar.gz dwt.tar && del dwt.tar

使用C#代码创建,解压,更新.tar.gz

下载SharpZipLib。

创建

private void CreateTarGZ(string tgzFilename, string sourceDirectory){Stream outStream = File.Create(tgzFilename);Stream gzoStream = new GZipOutputStream(outStream);TarArchive tarArchive = TarArchive.CreateOutputTarArchive(gzoStream);// Note that the RootPath is currently case sensitive and must be forward slashes e.g. "c:/temp"// and must not end with a slash, otherwise cuts off first char of filename// This is scheduled for fix in next releasetarArchive.RootPath = sourceDirectory.Replace('\\', '/');if (tarArchive.RootPath.EndsWith("/"))tarArchive.RootPath = tarArchive.RootPath.Remove(tarArchive.RootPath.Length - 1);AddDirectoryFilesToTar(tarArchive, sourceDirectory, true, true);tarArchive.Close();}private void AddDirectoryFilesToTar(TarArchive tarArchive, string sourceDirectory, bool recurse, bool isRoot){// Optionally, write an entry for the directory itself.// Specify false for recursion here if we will add the directory's files individually.//TarEntry tarEntry;if (!isRoot){tarEntry = TarEntry.CreateEntryFromFile(sourceDirectory);tarArchive.WriteEntry(tarEntry, false);}// Write each file to the tar.//string[] filenames = Directory.GetFiles(sourceDirectory);foreach (string filename in filenames){tarEntry = TarEntry.CreateEntryFromFile(filename);Console.WriteLine(tarEntry.Name);tarArchive.WriteEntry(tarEntry, true);}if (recurse){string[] directories = Directory.GetDirectories(sourceDirectory);foreach (string directory in directories)AddDirectoryFilesToTar(tarArchive, directory, recurse, false);}}

解压

public void ExtractTGZ(String gzArchiveName, String destFolder){Stream inStream = File.OpenRead(gzArchiveName);Stream gzipStream = new GZipInputStream(inStream);TarArchive tarArchive = TarArchive.CreateInputTarArchive(gzipStream);tarArchive.ExtractContents(destFolder);tarArchive.Close();gzipStream.Close();inStream.Close();}

更新

.tar.gz解压成.tar

public string ExtractGZipFile(string gzipFileName, string targetDir){// Use a 4K buffer. Any larger is a waste.    byte[] dataBuffer = new byte[4096];using (System.IO.Stream fs = new FileStream(gzipFileName, FileMode.Open, FileAccess.Read)){using (GZipInputStream gzipStream = new GZipInputStream(fs)){// Change this to your needsstring fnOut = Path.Combine(targetDir, Path.GetFileNameWithoutExtension(gzipFileName));using (FileStream fsOut = File.Create(fnOut)){StreamUtils.Copy(gzipStream, fsOut, dataBuffer);}return fnOut;}}}

更新.tar

public void UpdateTar(string tarFileName, string targetFile, bool asciiTranslate){using (FileStream fsIn = new FileStream(tarFileName, FileMode.Open, FileAccess.Read)){string tmpTar = Path.Combine(Path.GetDirectoryName(tarFileName), "tmp.tar");using (FileStream fsOut = new FileStream(tmpTar, FileMode.OpenOrCreate, FileAccess.Write)){TarOutputStream tarOutputStream = new TarOutputStream(fsOut);TarInputStream tarIn = new TarInputStream(fsIn);TarEntry tarEntry;while ((tarEntry = tarIn.GetNextEntry()) != null){if (tarEntry.IsDirectory){continue;}// Converts the unix forward slashes in the filenames to windows backslashes//string name = tarEntry.Name.Replace('/', Path.DirectorySeparatorChar);string sourceFileName = Path.GetFileName(targetFile);string targetFileName = Path.GetFileName(tarEntry.Name);if (sourceFileName.Equals(targetFileName)){using (Stream inputStream = File.OpenRead(targetFile)){long fileSize = inputStream.Length;TarEntry entry = TarEntry.CreateTarEntry(tarEntry.Name);// Must set size, otherwise TarOutputStream will fail when output exceeds.entry.Size = fileSize;// Add the entry to the tar stream, before writing the data.tarOutputStream.PutNextEntry(entry);// this is copied from TarArchive.WriteEntryCorebyte[] localBuffer = new byte[32 * 1024];while (true){int numRead = inputStream.Read(localBuffer, 0, localBuffer.Length);if (numRead <= 0){break;}tarOutputStream.Write(localBuffer, 0, numRead);}}tarOutputStream.CloseEntry();}else{tarOutputStream.PutNextEntry(tarEntry);if (asciiTranslate){CopyWithAsciiTranslate(tarIn, tarOutputStream);}else{tarIn.CopyEntryContents(tarOutputStream);}tarOutputStream.CloseEntry();}}tarIn.Close();tarOutputStream.Close();}File.Delete(tarFileName);File.Move(tmpTar, tarFileName);}}

更新.tar.gz

private void UpdateTarGZ(string tgzFilename, string tarFileName){Stream gzoStream = new GZipOutputStream(File.Create(tgzFilename));using (FileStream source = File.Open(tarFileName,FileMode.Open)){byte[] localBuffer = new byte[32 * 1024];while (true){int numRead = source.Read(localBuffer, 0, localBuffer.Length);if (numRead <= 0){break;}gzoStream.Write(localBuffer, 0, numRead);}}gzoStream.Close();File.Delete(tarFileName);}

编译

dotnet publish -c Release -r win10-x64

运行

源码

https://github.com/yushulx/dotnet-tar-gzip

如何在Windows上创建,解压,更新.tar.gz压缩包相关推荐

  1. tar命令解压jdk.tar.gz包 报错 gzip: stdin: not in gzip format

    转自:https://blog.csdn.net/LL_zhuo/article/details/44173355 遇到和这篇博文一样的问题了.用wget 从oracle官网下载jdk, http:/ ...

  2. linux中解压.tgz, .tar.gz ,zip ,gz, .tar文件

    将.tgz文件解压在当前目录: tar zxvf MY_NAME.tgz 将.tar.gz文件解压在当前目录: tar zxvf MY_NAME.tar.gz tar -xvf file.tar // ...

  3. java 压缩/解压【tar.gz】

    环境 操作系统:win7 java:jdk7 第三方包:commons-compress-1.14.jar 需求 不管是文件夹还是常规文件,实现基本的打包压缩. 思路: ①先把需要压缩的文件,打包成. ...

  4. windows安装程序创建_如何在Windows上创建已安装程序的列表

    windows安装程序创建 Reinstalling Windows is a good way to fix serious problems with your computer, or just ...

  5. 解压后缀.tar.gz的软件包

    gunzip postgresql-9.6.6.tar.gz tar -xvf postgresql-9.6.6.tar

  6. 如何在Windows上使用Git创建一个可执行脚本?

    长话短说,今天介绍如何在windows上使用Git上创建一个可执行的shell脚本. " 首先我们要知道windows上Git默认添加的文件权限是:-rw-r--r--(对应权限值是644) ...

  7. 【腾讯云 Finops Crane 集训营】 如何在Windows上快速搭建一个Kubernetes+Crane 环境及应用

    一.前言 个人主页: ζ小菜鸡 大家好我是ζ小菜鸡,让我们一起学习在 Windows 如何快速搭建一个Kubernetes+Crane 环境及应用. 如果文章对你有帮助.欢迎关注.点赞.收藏(一键三连 ...

  8. 如何在windows上搭建mysql_如何在Windows上安装多个MySQL

    [IT168 技术文档]本文以免安装版的mysql(Without installer)为例,对如何在Windows上安装多个MySQL进行讲解. 免安装版的mysql(Without install ...

  9. 如何在windows上使用VMware安装macOS虚拟机

    如何在windows上使用VMware安装macOS虚拟机 一.准备工作 1.1 安装 VMware 1.2 下载macOS的安装包 1.3 下载VMware虚拟机解锁安装苹果系统工具 二.解锁VMw ...

最新文章

  1. 使用c#+(datagrid控件)编辑xml文件
  2. 无人驾驶、VR、AR时代即将开启,中国电信2018年将完成5G商用版本
  3. 一行命令同时修改maven项目中多个mudule的版本号
  4. C语言中strdup函数使用方法
  5. ASP.NET Core分布式项目实战(集成ASP.NETCore Identity)--学习笔记
  6. 给matrix重新列名_如何认真升级Mac终端(甚至给它一个Matrix主题)
  7. java swing 串口_ComTest 接收串口数据,并显示在文本框内,通过JavaSwing实现 Develop 265万源代码下载- www.pudn.com...
  8. palm基础----8 国际化
  9. 从零开始学做微信小程序,看这些就够了!
  10. 学习单片机入门需要准备什么?
  11. c语言删除功能,程序的删除功能有问题,不知怎么改
  12. 任务管理平台_“平房区教师培训学分管理平台启用暨任务部署培训会议”
  13. Java之父詹姆斯•高斯林趣闻
  14. 升级了谷歌浏览器最新版不习惯,如何降级版本
  15. 大赛来袭 | 千万项目商机+超40W大赛奖金,快来报名吧!
  16. 解决win10下PPT打不开,显示内容有问题,提示修复但修复不成功
  17. 配置Web DashBoard
  18. centOs7 下载vim命令
  19. ios运行html时黑屏,原神ios黑屏打不开怎么办?原神ios闪退解决方法
  20. 北京交通大学计算机博士导师,董平(北京交通大学教授、博士生导师)_百度百科...

热门文章

  1. vue---批量删除表格数据
  2. 第三章数字逻辑电路基础
  3. kindeditor上传图片后自动缩放尺寸
  4. 因计算机丢失wer.dll 无法启动程序,win10x64缺少dll依赖库致使程序无法运行
  5. Latex报错:xxxx.sty文件不存在解决方案
  6. Flash Builder 4.7 破解安装
  7. 金融银行测试面试题分享
  8. 小学三年级计算机上册课后反思,三年级上册数学教学反思
  9. 2017 阿里巴巴矢量图标库 导入所选图标到jsp页面步骤
  10. 遗传算法优化matlab,Matlab遗传算法优化中的一个优化的表达