如何在Windows上创建,解压,更新.tar.gz压缩包
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压缩包相关推荐
- tar命令解压jdk.tar.gz包 报错 gzip: stdin: not in gzip format
转自:https://blog.csdn.net/LL_zhuo/article/details/44173355 遇到和这篇博文一样的问题了.用wget 从oracle官网下载jdk, http:/ ...
- 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 // ...
- java 压缩/解压【tar.gz】
环境 操作系统:win7 java:jdk7 第三方包:commons-compress-1.14.jar 需求 不管是文件夹还是常规文件,实现基本的打包压缩. 思路: ①先把需要压缩的文件,打包成. ...
- windows安装程序创建_如何在Windows上创建已安装程序的列表
windows安装程序创建 Reinstalling Windows is a good way to fix serious problems with your computer, or just ...
- 解压后缀.tar.gz的软件包
gunzip postgresql-9.6.6.tar.gz tar -xvf postgresql-9.6.6.tar
- 如何在Windows上使用Git创建一个可执行脚本?
长话短说,今天介绍如何在windows上使用Git上创建一个可执行的shell脚本. " 首先我们要知道windows上Git默认添加的文件权限是:-rw-r--r--(对应权限值是644) ...
- 【腾讯云 Finops Crane 集训营】 如何在Windows上快速搭建一个Kubernetes+Crane 环境及应用
一.前言 个人主页: ζ小菜鸡 大家好我是ζ小菜鸡,让我们一起学习在 Windows 如何快速搭建一个Kubernetes+Crane 环境及应用. 如果文章对你有帮助.欢迎关注.点赞.收藏(一键三连 ...
- 如何在windows上搭建mysql_如何在Windows上安装多个MySQL
[IT168 技术文档]本文以免安装版的mysql(Without installer)为例,对如何在Windows上安装多个MySQL进行讲解. 免安装版的mysql(Without install ...
- 如何在windows上使用VMware安装macOS虚拟机
如何在windows上使用VMware安装macOS虚拟机 一.准备工作 1.1 安装 VMware 1.2 下载macOS的安装包 1.3 下载VMware虚拟机解锁安装苹果系统工具 二.解锁VMw ...
最新文章
- 使用c#+(datagrid控件)编辑xml文件
- 无人驾驶、VR、AR时代即将开启,中国电信2018年将完成5G商用版本
- 一行命令同时修改maven项目中多个mudule的版本号
- C语言中strdup函数使用方法
- ASP.NET Core分布式项目实战(集成ASP.NETCore Identity)--学习笔记
- 给matrix重新列名_如何认真升级Mac终端(甚至给它一个Matrix主题)
- java swing 串口_ComTest 接收串口数据,并显示在文本框内,通过JavaSwing实现 Develop 265万源代码下载- www.pudn.com...
- palm基础----8 国际化
- 从零开始学做微信小程序,看这些就够了!
- 学习单片机入门需要准备什么?
- c语言删除功能,程序的删除功能有问题,不知怎么改
- 任务管理平台_“平房区教师培训学分管理平台启用暨任务部署培训会议”
- Java之父詹姆斯•高斯林趣闻
- 升级了谷歌浏览器最新版不习惯,如何降级版本
- 大赛来袭 | 千万项目商机+超40W大赛奖金,快来报名吧!
- 解决win10下PPT打不开,显示内容有问题,提示修复但修复不成功
- 配置Web DashBoard
- centOs7 下载vim命令
- ios运行html时黑屏,原神ios黑屏打不开怎么办?原神ios闪退解决方法
- 北京交通大学计算机博士导师,董平(北京交通大学教授、博士生导师)_百度百科...