Golang解压压缩文件
来源:互联网 发布:淘宝 买多了一分钱 编辑:程序博客网 时间:2024/05/09 02:39
[转载来源]
(http://blog.csdn.net/fyxichen/article/details/50807697)
package WinRARimport ( "archive/tar" "compress/gzip" "errors" "fmt" "io" "io/ioutil" "os" "path" "strings" l4g "github.com/alecthomas/log4go")//FileName 待压缩的文件名//DesPathName 压缩完之后存放的目录名func Gzip(FilePathName, DesPathName string) error { // 清理路径字符串 FilePathName = path.Clean(FilePathName) // 要解压的文件名字 FileName := FilePathName index := strings.LastIndex(FilePathName, "\\") if index != -1 { FileName = FilePathName[index+1:] } fmt.Println("文件名称是", FileName) //创建存放压缩文件的路径(如果文件夹不存在) if !dirExists(DesPathName) { os.MkdirAll(DesPathName, 0777) } fmt.Println("创建文件") //创建压缩文件 DesFileName := DesPathName + "\\" + FileName + ".gz" fw, er := os.Create(DesFileName) if er != nil { return er } defer fw.Close() gw := gzip.NewWriter(fw) defer gw.Close() //读取文件内容 rd := make([]byte, 1024*1024) rd, err := ioutil.ReadFile(FilePathName) if err != nil { fmt.Println("读取文件内的数据出错 err:", err) return err } // 获取文件或目录信息 fi, err := os.Stat(FilePathName) if err != nil { fmt.Println("获取文件的详细信息出错 err :", err) return nil } gw.Name = fi.Name() gw.ModTime = fi.ModTime() _, err = gw.Write(rd) if err != nil { fmt.Println("写入压缩文件出错 err:", err) return err } err = gw.Flush() if err != nil { fmt.Println("gw.Flush() 出错 err:", err) return err } return nil}func UnGz(srcGz string) error { fr, err := os.Open(srcGz) if err != nil { l4g.Error("open secGZ failed. err:%v", err) return err } gr, err := gzip.NewReader(fr) if err != nil { fr.Close() l4g.Error("create gzip.reader failed. err:%v", err) return err } index := strings.LastIndex(srcGz, ".") if index == -1 { gr.Close() fr.Close() l4g.Error("find . failed. err:%v", err) return err } fw, err := os.Create(filePath) if err != nil { gr.Close() fr.Close() l4g.Error("create file failed. err:%v", err) return err } // 写文件 _, err = io.Copy(fw, gr) if err != nil { fw.Close() gr.Close() fr.Close() l4g.Error("write file failed. err:%v", err) return err } fw.Close() gr.Close() fr.Close() //删除gz压缩文件 err = os.Remove(srcGz) if err != nil { l4g.Error("remove file failed. err:%v", err) return err } return nil}// 将文件或目录打包成 .tar 文件// src 是要打包的文件或目录的路径// dstTar 是要生成的 .tar 文件的路径// failIfExiBst 标记如果 dstTar 文件存在,是否放弃打包,如果否,则会覆盖已存在的文件func TarGz(src string, dstTar string, failIfExist bool) error { // 清理路径字符串 src = path.Clean(src) // 判断要打包的文件或目录是否存在 if !exists(src) { return errors.New("要打包的文件或目录不存在:" + src) } // 判断目标文件是否存在 if fileExists(dstTar) { if failIfExist { // 不覆盖已存在的文件 return errors.New("目标文件已经存在:" + dstTar) } else { // 覆盖已存在的文件 if er := os.Remove(dstTar); er != nil { return er } } } // 创建空的目标文件 fw, er := os.Create(dstTar) if er != nil { return er } defer fw.Close() gw := gzip.NewWriter(fw) defer gw.Close() // 创建 tar.Writer,执行打包操作 tw := tar.NewWriter(gw) var err error defer func() { // 这里要判断 tw 是否关闭成功,如果关闭失败,则 .tar 文件可能不完整 if er := tw.Close(); er != nil { err = er } }() // 获取文件或目录信息 fi, er := os.Stat(src) if er != nil { return er } // 获取要打包的文件或目录的所在位置和名称 srcBase, srcRelative := path.Split(path.Clean(src)) // 开始打包 if fi.IsDir() { fmt.Println("第一层目录:", srcRelative) tarDir(srcBase, srcRelative, tw, fi) } else { tarFile(srcBase, srcRelative, tw, fi) } return nil}// 因为要执行遍历操作,所以要单独创建一个函数func tarDir(srcBase, srcRelative string, tw *tar.Writer, fi os.FileInfo) (err error) { // 获取完整路径 srcFull := srcBase + srcRelative fmt.Println("srcFull:", srcFull) // 在结尾添加 "/" last := len(srcRelative) - 1 if srcRelative[last] != os.PathSeparator { srcRelative += string(os.PathSeparator) } // 获取 srcFull 下的文件或子目录列表 fis, er := ioutil.ReadDir(srcFull) if er != nil { return er } // 开始遍历 for _, fi := range fis { if fi.IsDir() { fmt.Println("下层目录") tarDir(srcBase, srcRelative+fi.Name(), tw, fi) } else { fmt.Println("是文件") tarFile(srcBase, srcRelative+fi.Name(), tw, fi) } } return nil}// 因为要在 defer 中关闭文件,所以要单独创建一个函数func tarFile(srcBase, srcRelative string, tw *tar.Writer, fi os.FileInfo) (err error) { // 获取完整路径 srcFull := srcBase + srcRelative fmt.Println("文件的全路径", srcFull) // 写入文件信息 hdr, er := tar.FileInfoHeader(fi, "") if er != nil { return er } fmt.Println(srcRelative) hdr.Name = srcRelative fmt.Println("文件hdr.name", hdr.Name) if er = tw.WriteHeader(hdr); er != nil { return er } // 打开要打包的文件,准备读取 fr, er := os.Open(srcFull) if er != nil { return er } defer fr.Close() // 将文件数据写入 tw 中 if _, er = io.Copy(tw, fr); er != nil { return er } return nil}//解包 可以解压,压缩文件里有文件夹的,也可以解压压缩文件里全是文件的//srcGz待解包文件//dstDir 解包之后存放的目录func UnTarGz(srcGz string, dstDir string) error { fmt.Println("--- dstDir:", dstDir) dstDir = path.Clean(dstDir) + string(os.PathSeparator) fmt.Println("=== dstDir:", dstDir) //打开压缩文件 fr, err := os.Open(srcGz) if err != nil { return err } defer fr.Close() gw, err := gzip.NewReader(fr) defer gw.Close() // 创建 tar.Reader 对象,准备执行解包操作 // 可以用 tr.Next() 来遍历包中的文件 tr := tar.NewReader(gw) // 遍历包中的文件 for hdr, er := tr.Next(); er != io.EOF; hdr, er = tr.Next() { if er != nil { fmt.Println("--------- er:", er) return er } // 获取文件信息 fi := hdr.FileInfo() // 获取绝对路径 dstFullPath := dstDir + hdr.Name fmt.Println("--- dstFullPath:", dstFullPath) if hdr.Typeflag == tar.TypeDir { fmt.Println("--- type is floder") // 创建目录 os.MkdirAll(dstFullPath, fi.Mode().Perm()) // 设置目录权限 os.Chmod(dstFullPath, fi.Mode().Perm()) } else { fmt.Println(dstFullPath, "--- type is file") // 创建文件所在的目录 strtemp := dstFullPath[:strings.LastIndex(dstFullPath, "\\")+1] //os.MkdirAll(path.Dir(dstFullPath), os.ModePerm) os.MkdirAll(strtemp, os.ModePerm) // 将 tr 中的数据写入文件中 if er := unTarFile(dstFullPath, tr); er != nil { fmt.Println(er) return er } // 设置文件权限 os.Chmod(dstFullPath, fi.Mode().Perm()) } } return nil}// 因为要在 defer 中关闭文件,所以要单独创建一个函数func unTarFile(dstFile string, tr *tar.Reader) error { // 创建空文件,准备写入解包后的数据 fw, er := os.Create(dstFile) if er != nil { return er } defer fw.Close() // 写入解包后的数据 _, er = io.Copy(fw, tr) if er != nil { return er } return nil}// 判断档案是否存在func exists(name string) bool { _, err := os.Stat(name) return err == nil || os.IsExist(err)}// 判断文件是否存在func fileExists(filename string) bool { fi, err := os.Stat(filename) return (err == nil || os.IsExist(err)) && !fi.IsDir()}// 判断目录是否存在func dirExists(dirname string) bool { fi, err := os.Stat(dirname) return (err == nil || os.IsExist(err)) && fi.IsDir()}
自己整合的网络资源,难免错误。谢谢
1 0
- Golang解压压缩文件
- 压缩文件的解压 linux
- java 解压zip压缩文件
- 用SharpZip解压/压缩文件
- JSP解压ZIP压缩文件
- C#解压RAR压缩文件
- C#解压RAR压缩文件
- C#压缩文件,解压文件。
- c#解压、压缩文件
- Zip压缩文件 与 解压
- java解压和压缩文件
- 解压.Z压缩文件
- java解压RAR压缩文件
- tar.xz压缩文件解压
- JSP解压ZIP压缩文件
- 解压压缩文件命令 linux
- linux下解压,压缩文件
- Ubuntu压缩文件解压文件
- JAVA常用术语缩写
- IP 、子网掩码、网关
- 【C/C++】《C++ Primer》(第五版)-第2章笔记(含完整练习答案)
- Tensorflow的Protocol Buffers3编程(二)
- 2.6.24以上内核中netlink使用方法
- Golang解压压缩文件
- com.sun.mail.smtp.SMTPSendFailedException: 554 MI:SPB UserReject 0,smtp7
- Binder
- Palo Alto 1.05亿美元收购LightCyber 增加行为攻击检测能力
- 和菜鸟一起学linux之V4L2摄像头应用流程
- 关于HBC路由器设置端口映射
- python绘制简单的热图
- 04.06前端面试
- Spark安装部署