GO语言写的.tar.gz压缩和解压代码

//压缩

package main



import (
        "archive/tar"
        "compress/gzip"
        "io"
        "os"
        "path"
)


//srcDirPath 源文件路径
//destFilePath 压缩后到文件
func Compress(srcDirPath string, destFilePath string) error {
        fw, err := os.Create(destFilePath)
        if err != nil {
                return err
        }
        defer fw.Close()


        gw := gzip.NewWriter(fw)
        defer gw.Close()


        tw := tar.NewWriter(gw)
        defer tw.Close()


        f, err := os.Open(srcDirPath)
        if err != nil {
                return err
        }
        fi, err := f.Stat()
        if err != nil {
                return err
        }
        if fi.IsDir() {
                err = compressDir(srcDirPath, path.Base(srcDirPath), tw)
                if err != nil {
                        return err
                }
        } else {
                err := compressFile(srcDirPath, fi.Name(), tw, fi)
                if err != nil {
                        return err
                }
        }
        return nil

}

func compressDir(srcDirPath string, recPath string, tw *tar.Writer) error {
        dir, err := os.Open(srcDirPath)
        if err != nil {
                return err
        }
        defer dir.Close()


        fis, err := dir.Readdir(0)
        if err != nil {
                return err
        }
        for _, fi := range fis {
                curPath := srcDirPath + "/" + fi.Name()


                if fi.IsDir() {
                        err = compressDir(curPath, recPath+"/"+fi.Name(), tw)
                        if err != nil {
                                return err
                        }
                }


                err = compressFile(curPath, recPath+"/"+fi.Name(), tw, fi)
                if err != nil {
                        return err
                }
        }
        return nil
}

func compressFile(srcFile string, recPath string, tw *tar.Writer, fi os.FileInfo) error {
        if fi.IsDir() {
                hdr := new(tar.Header)
                hdr.Name = recPath + "/"
                hdr.Typeflag = tar.TypeDir
                hdr.Size = 0
                hdr.Mode = int64(fi.Mode())
                hdr.ModTime = fi.ModTime()


                err := tw.WriteHeader(hdr)
                if err != nil {
                        return err
                }
        } else {
                fr, err := os.Open(srcFile)
                if err != nil {
                        return err
                }
                defer fr.Close()


                hdr := new(tar.Header)
                hdr.Name = recPath
                hdr.Size = fi.Size()
                hdr.Mode = int64(fi.Mode())
                hdr.ModTime = fi.ModTime()


                err = tw.WriteHeader(hdr)
                if err != nil {
                        return err
                }


                _, err = io.Copy(tw, fr)
                if err != nil {
                        return err
                }
        }
        return nil
}

func main() {
        srcDirPath := "/home/zzy/go/src/test/aaa.go"
        destFilePath := "/home/zzy/go/src/test/test.tar.gz"
        Compress(srcDirPath, destFilePath)

}


//解压

import (
        "archive/tar"
        "compress/gzip"
        "io"
        "os"
        "path"
)


func Uncompress(srcFilePath string, destDirPath string) error {
        os.Mkdir(destDirPath, os.ModePerm)


        fr, err := os.Open(srcFilePath)
        if err != nil {
                return err
        }
        defer fr.Close()


        gr, err := gzip.NewReader(fr)
        if err != nil {
                return err
        }
        defer gr.Close()


        tr := tar.NewReader(gr)


        for {
                hdr, err := tr.Next()
                if err == io.EOF {
                        break
                }


                if hdr.Typeflag != tar.TypeDir {
                        os.MkdirAll(destDirPath+"/"+path.Dir(hdr.Name), os.ModePerm)


                        fw, _ := os.OpenFile(destDirPath+"/"+hdr.Name, os.O_CREATE|os.O_WRONLY, os.FileMode(hdr.Mode))
                        if err != nil {
                                return err
                        }
                        _, err = io.Copy(fw, tr)
                        if err != nil {
                                return err
                        }
                }
        }
        return nil
}


func main() {
        srcFilePath := "/home/zzy/go/src/test/test.tar.gz"
        destDirPath := "/home/zzy/go/src/test/."
        Uncompress(srcFilePath, destDirPath)

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值