关于golang:文件压缩的一种实现

33次阅读

共计 1389 个字符,预计需要花费 4 分钟才能阅读完成。

记录一下对文件进行压缩的实现,这里只列出了外围代码

/*
函数名:makeTarGzip
        制作压缩包,进步在线传输速率
参 数:encFile ,         密文文件
        signFile ,        签名文件
返回值:压缩后文件名
        错误信息
创立工夫及创建者:2021-06-15    Yuan_sr
*/
func makeTarGzip(encFile, signFile string) (string, error){
    tarGzipFileName =   "example.tar.gz"
    
    // file write
    fw, err := os.Create(tarGzipFileName)
    if err != nil {return "", err}
    defer fw.Close()

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

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

    // 关上文件夹
    dir, err := os.Open("./")
    if err != nil {return "", err}
    defer dir.Close()

    // 读取文件列表
    fis, err := dir.Readdir(0)
    if err != nil {return "", err}
    for _, fi := range fis{if fi.IsDir(){continue}
        if fi.Name() == encFile || fi.Name() == signFile{ // 去掉这个条件能够实现该目录下所有文件的压缩
            ef, err := os.Open(dir.Name() + "/" + fi.Name())
            if err != nil {return "", err}
            defer ef.Close()

            // 信息头
            h := new(tar.Header)
            h.Name = fi.Name()
            h.Size = fi.Size()
            h.Mode = int64(fi.Mode())
            h.ModTime = fi.ModTime()
            // 写信息头
            err = tw.WriteHeader(h)
            if err != nil {return "", err}
            _, err = io.Copy(tw, ef)
            if err != nil {return "", err}
        }
    }
    return tarGzipFileName, err
}

/*
函数名:unTarGzip
        文件解压缩
参 数:tarGzipFile ,     待解压缩文件
返回值:错误信息
创立工夫及创建者:2021-06-15    Yuan_sr
*/
func unTarGzip (tarGzipFile string) error {fr, err := os.Open(tarGzipFile)
    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 {h, err := tr.Next()
        if err == io.EOF {break}
        if err != nil {return  err}
        fw, err := os.OpenFile(h.Name, os.O_CREATE | os.O_WRONLY, 0755)
        if err != nil {return err}
        defer fw.Close()

        _, err = io.Copy(fw, tr)
        if err != nil {return err}
    }
    return nil
}

正文完
 0