首页 > 其他分享 >go压缩和解压文件

go压缩和解压文件

时间:2023-03-21 10:14:35浏览次数:23  
标签:解压 return err nil 压缩 file go os tar

压缩和解压文件

package main

import (
    "archive/tar"
    "compress/gzip"
    "fmt"
    "io"
    "os"
    "strings"
)

// Compress 压缩 使用gzip压缩成tar.gz
func Compress(files []*os.File, dest string) error {
    d, _ := os.Create(dest)
    defer d.Close()
    gw := gzip.NewWriter(d)
    defer gw.Close()
    tw := tar.NewWriter(gw)
    defer tw.Close()
    for _, file := range files {
        err := compress(file, "", tw)
        if err != nil {
            return err
        }
    }
    return nil
}

// compress tool of compress
func compress(file *os.File, prefix string, tw *tar.Writer) error {
    info, err := file.Stat()
    if err != nil {
        return err
    }
    if info.IsDir() {
        prefix = prefix + "/" + info.Name()
        fileInfos, err := file.Readdir(-1)
        if err != nil {
            return err
        }
        for _, fi := range fileInfos {
            f, err := os.Open(file.Name() + "/" + fi.Name())
            if err != nil {
                return err
            }
            err = compress(f, prefix, tw)
            if err != nil {
                return err
            }
        }
    } else {
        header, err := tar.FileInfoHeader(info, "")
        header.Name = prefix + "/" + header.Name
        if err != nil {
            return err
        }
        err = tw.WriteHeader(header)
        if err != nil {
            return err
        }
        _, err = io.Copy(tw, file)
        file.Close()
        if err != nil {
            return err
        }
    }
    return nil
}

// DeCompress 解压 tar.gz
func DeCompress(tarFile, dest string) error {
    srcFile, err := os.Open(tarFile)
    if err != nil {
        return err
    }
    defer srcFile.Close()
    gr, err := gzip.NewReader(srcFile)
    if err != nil {
        return err
    }
    defer gr.Close()
    tr := tar.NewReader(gr)
    for {
        hdr, err := tr.Next()
        if err != nil {
            if err == io.EOF {
                break
            } else {
                return err
            }
        }
        filename := dest + hdr.Name
        file, err := createFile(filename)
        if err != nil {
            return err
        }
        _, err = io.Copy(file, tr)
        if err != nil {
            return err
        }
    }
    return nil
}

// createFile create file
func createFile(name string) (*os.File, error) {
    err := os.MkdirAll(string([]rune(name)[0:strings.LastIndex(name, "/")]), 0o755)
    if err != nil {
        return nil, err
    }
    return os.Create(name)
}

// TraverseFolder file for each
func TraverseFolder(tempPath string) ([]*os.File, error) {
    files, err := os.ReadDir(tempPath)
    if err != nil {
        return nil, err
    }
    var myFile []*os.File
    for _, file := range files {
        tmpOsFile, err := os.Open(fmt.Sprintf("%s/%s", tempPath, file.Name()))
        if err != nil {
            return nil, err
        }
        myFile = append(myFile, tmpOsFile)
    }
    return myFile, nil
}

验证解压和压缩文件

package main

import (
    "os"
)

func main() {
    dstPath := "tmp.tar.gz"
    tempFileList, err := TraverseFolder("./temp")
    if err != nil {
        panic(err)
    }
    versionFile, err := os.Open("./version/version.yml")
    if err != nil {
        panic(err)
    }
    var zipFileList []*os.File
    zipFileList = append(zipFileList, tempFileList...)
    zipFileList = append(zipFileList, versionFile)
    Compress(zipFileList, dstPath)
    DeCompress(dstPath, "unCompress")
}

 

标签:解压,return,err,nil,压缩,file,go,os,tar
From: https://www.cnblogs.com/xuweiqiang/p/17238912.html

相关文章

  • Python Django 登陆案例
    在根目录下新建一个templates文件将该目录添加到settings.py文件内在templates文件夹内新建一个login.html文件,并写入模板内容<!DOCTYPEhtml><htmllang="z......
  • Go语言:利用 TDD 驱动开发测试 学习结构体、方法和接口
    环境安装:(新手向)在Linux中使用VScode编写"Hello,world"程序,并编写测试-Ubuntu20.4上一篇相关随笔:Go语言:利用TDD测试驱动开发帮助理解数组与动态数组(切片)的区别......
  • stl之iterator_category
    首先要知道stl的算法是什么?算法(Algorithm)是functiontemplate,Algorithm看不见容器(Containers),所以要从iterator取信息,iterator必须回答Algorithm的问题来进行......
  • django中使用分页器功能
    要使用Django实现分页器,必须从Django中导入Paginator模块fromdjango.core.paginatorimportPaginator假如现在有150条记录要显示,每页显示10条>>>fromdjango.co......
  • go语言学习-标准库template和http
    templatehtml/template包实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出。它提供了和text/template包相同的接口,Go语言中输出HTML的场景都应使用text/template......
  • 深入理解Go语言中的sync.Cond
    1.简介本文将介绍Go语言中的sync.Cond并发原语,包括sync.Cond的基本使用方法、实现原理、使用注意事项以及常见的使用使用场景。能够更好地理解和应用Cond来实现g......
  • zbus logo消息队列、服务总线 zbus
    轻量级服务总线/消息队列1)多种消息模式--支持生产者/消费者,发布订阅,RPC2)丰富的API--C/C++/C#/JAVA/Python/Node.JS跨平台、多语言支持3)开放协议标准--原生兼容HTTP协议(长......
  • 汉源高科4KHDMI高清音视频光端机带USB键鼠10G万兆光纤延长器实时非压缩 ​​​
    ......
  • 聊聊数据压缩
    什么情况适合使用数据压缩?数据压缩不仅能节省存储空间,还可以用于提升网络传输性能。通过网络传输数据,使用数据压缩前后,处理的时间会有一些差别:压缩前:传输未压缩数据耗......
  • Go语言:利用 TDD 测试驱动开发帮助理解数组与动态数组(切片)的区别
    ArrayVSSlice数组允许你以特定的顺序在变量中存储相同类型的多个元素。对于数组来说,最常见的就是迭代数组中的元素。我们创建一个Sum函数,它使......