golang 用tar打包文件或文件夹
打包文件用到了tar包,其中tar包的用法可以参考API
golang提供了个函数用来遍历文件夹 filepath.Walk
函数具体描述如下:
func Walk(root string, walkFn WalkFunc) error root是用遍历的文件夹
type WalkFunc
type WalkFunc func(path string, info os.FileInfo, err error) error path参数是返回遍历的文件路径和文件信息
在使用中如代码中蓝色部分,通过该方法呢,我们可以对文件和文件夹的操作更加熟悉,其中用到了
os.Create 用来创建文件,返回文件信息和错误信息 func Create(name string) (file *File, err error)
os.Remove 用来删除文件,返回错误信息 func Remove(name string) error
os.Stat 用来返回文件具体信息,返回文件信息和错误信息 func (f *File) Stat() (fi FileInfo, err error)
os.Open 用来打开文件,返回文件信息和错误信息 func Open(name string) (file *File, err error)
io.Copy 复职文件信息到Writer func Copy(dst Writer, src Reader) (written int64, err error)func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error)
os.Mkdir 用来创建文件夹,返回错误信息 func Mkdir(name string, perm FileMode) errorstrings.TrimPrefix(targetpath, directory) 这个方法获取具体的文件路径相对目标文件夹的相对路径,也是在tar包中创建文件夹的相对路径
package main
import (
"archive/tar"
"fmt"
"io"
"os"
"path/filepath"
"strings"
)
/***生成***/
func createTar(filesource, filetarget string, deleteIfExist bool) error {
//create tar file with targetfile name
tarfile, err := os.Create(filetarget)
if err != nil {
// if file is exist then delete file
if err == os.ErrExist {
if err := os.Remove(filetarget); err != nil {
fmt.Println(err)
return err
}
} else {
fmt.Println(err)
return err
}
}
defer tarfile.Close()
tarwriter := tar.NewWriter(tarfile)
sfileInfo, err := os.Stat(filesource)
if err != nil {
fmt.Println(err)
return err
}
if !sfileInfo.IsDir() {
return tarFile(filetarget, filesource, sfileInfo, tarwriter)
} else {
return tarFolder(filesource, tarwriter)
}
return nil
}
func tarFile(directory string, filesource string, sfileInfo os.FileInfo, tarwriter *tar.Writer) error {
sfile, err := os.Open(filesource)
if err != nil {
panic(err)
return err
}
defer sfile.Close()
header, err := tar.FileInfoHeader(sfileInfo, "")
if err != nil {
fmt.Println(err)
return err
}
header.Name = directory
err = tarwriter.WriteHeader(header)
if err != nil {
fmt.Println(err)
return err
}
// can use buffer to copy the file to tar writer
// buf := make([]byte,15)
// if _, err = io.CopyBuffer(tarwriter, sfile, buf); err != nil {
// panic(err)
// return err
// }
if _, err = io.Copy(tarwriter, sfile); err != nil {
fmt.Println(err)
panic(err)
return err
}
return nil
}
func tarFolder(directory string, tarwriter *tar.Writer) error {
var baseFolder string = filepath.Base(directory)
//fmt.Println(baseFolder)
return filepath.Walk(directory, func(targetpath string, file os.FileInfo, err error) error {
//read the file failure
if file == nil {
panic(err)
return err
}
if file.IsDir() {
// information of file or folder
header, err := tar.FileInfoHeader(file, "")
if err != nil {
return err
}
header.Name = filepath.Join(baseFolder, strings.TrimPrefix(targetpath, directory))
fmt.Println(hdr.Name)
if err = tarwriter.WriteHeader(header); err != nil {
return err
}
os.Mkdir(strings.TrimPrefix(baseFolder, file.Name()), os.ModeDir)
return nil
} else {
//baseFolder is the tar file path
var fileFolder = filepath.Join(baseFolder, strings.TrimPrefix(targetpath, directory))
return tarFile(fileFolder, targetpath, file, tarwriter)
}
})
}
golang 用tar打包文件或文件夹的更多相关文章
- linux中tar 打包指定路径文件
linux中tar打包指定路径文件www.111cn.net 编辑:yahoo 来源:转载在linux系统中打包与解压文件我都可以使用tar命令来解决,只要使用不同的参数就可以实现不同的需要了,下面来 ...
- tar打包过滤某个文件及文件夹
ip=ip add|grep eth0|grep -i inet|awk '{print $2}'|cut -d '/' -f 1 cd /data tar -zvcf `echo $ip`_`dat ...
- tar打包排除某个文件夹
tar -zcvf package.tar.gz --exclude package/logs --exclude package/runtime ./package 使用exclude关键字设置需要 ...
- tar 打包当前目录下文件但不包括该录
今天想打包一些文件,但是不想把该目录打包进去 比如我想把test目录下文件打个包,安装正常的命令来 tar zcf test.tar.gz test 这样肯定会把test目录也打进去,解压后肯定是te ...
- tar打包如何不打包某一个文件夹(排除某些文件夹)
tar打包如何不打包某一个文件夹(排除某些文件夹) 问题描述: 最近想备份一下Tomcat运行的的功能文件,以防特殊情况的发生.但是在实际操作的过程中发现,可能是由于Unix/Linux版本太老的原因 ...
- linux下打包文件或文件夹
转自: 在linux下如何将文件夹打包 http://blog.csdn.net/cynhafa/article/details/7303338 linux zi ...
- tar 打包处理文件
基本格式:tar [Options] file_archive //注意tar的第一参数必须为命令选项,即不能直接接待处理文件 Option是由三部分组成,分别是操作类型(创建,查看,解压),压缩处理 ...
- 使用Java API进行tar.gz文件及文件夹压缩解压缩
在java(JDK)中我们可以使用ZipOutputStream去创建zip压缩文件,(参考我之前写的文章 使用java API进行zip递归压缩文件夹以及解压 ),也可以使用GZIPOutputSt ...
- Linux tar (打包.压缩.解压缩)命令说明 | tar如何解压文件到指定的目录?
打包举例:将 /usr/local/src/zlib-1.2.5目录下的文件打包成 zlib-1.2.5.tar.gz cd /usr/local/src tar -czvf ./zlib-1.2.5 ...
随机推荐
- COM组件转换为.NET元数据
.net开发中,需要调用一些COM组件,COM组件的元素转化为.net的元数据后才能很好的调用. 下面贴出我转的过程. 首先,打开C:\Program Files (x86)\Microsoft SD ...
- HDU4466 Triangle
题意:给一个长为N的铁丝,问你有几种方法将其划分为若干段,使得每一段都能围成一个边长为整数的三角形,并且围成的三角形都相似 思路其实很明显,三角形的周长必定是N的约数,那么答案就是周长C能围城的三角形 ...
- 物联网设备是如何被破解的?分析一种篡改IoT固件内容的攻击方式
随着智能硬件进入到人们的生活,人们的生活质量开始有逐步的提高,人们与智能硬件之间的联系更加紧密.同时,智能硬件的安全问题也必须引起高度重视,因为其直接影响到人身安全.社会安全和国家安全. 大家是否 ...
- [Phonegap+Sencha Touch] 移动开发24 打包wp8.1的App,执行时输入框聚焦弹出软键盘之后,界面上移而不恢复原位的解决的方法
这个现象仅仅出如今phonegap打包sencha touch的wp8.1程序会出现(仅wp8.1,wp8正常),其他js框架我測试了几个(app framework, jquery mobile), ...
- C#调用RESTful API
如今非常多的网络服务都用RESTful API来实现. 比方百度的搜索推广API介绍使用Rest原因:REST+JSON风格的API相比SOAP+XML,优点是:调用更加灵活.也更easy扩展:JSO ...
- WAS集群系列(2):数据库连接低级错误——网络连接问题
环境 项目点 指标 WAS版本号 7.0 应用server操作系统 Windows 2008 应用server系统位数 64bit 数据库server操作系统 CentOS 5.6 数据库版本号 Or ...
- Esri:为Web GIS注入新内涵
纵观近些年IT与空间技术的发展,云计算.大数据.实时信息.LBS.无人机.倾斜摄影等新技术层出不穷:互联网基础设施建设成绩瞩目,宽带成为国家战略性公共基础设施. GIS(地理信息系统)作为空间信息分析 ...
- 【 全干货 】5 分钟带你看懂 Docker !
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者丨唐文广:腾讯工程师,负责无线研发部地图测试. 导语:Docker,近两年才流行起来的超轻量级虚拟机,它可以让你轻松完成持续集成.自动交付 ...
- Intellijidea建javaWeb以及Servlet简单实现
一.创建并设置javaweb工程1.创建javaweb工程File --> New --> Project... 点击Project后出现如下界面,选择Java Enterprise,选中 ...
- linux下脚本做成服务
一.脚本做成服务 1.把启动脚本复制到 /etc/init.d目录中 2.脚本内容 xxxx代表jar包名称 #!/usr/bin/env bash # chkconfig: 2345 20 80 # ...