文件压缩的一种实现

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

/*
函数名:    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
}

你可能感兴趣的:(golang)