加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

用golang解压文件的简单方法

发布时间:2020-12-16 19:20:02 所属栏目:大数据 来源:网络整理
导读:有没有一个简单的方式来解压文件与golang? 现在我的代码是: func Unzip(src,dest string) error { r,err := zip.OpenReader(src) if err != nil { return err } defer r.Close() for _,f := range r.File { rc,err := f.Open() if err != nil { return err
有没有一个简单的方式来解压文件与golang?

现在我的代码是:

func Unzip(src,dest string) error {
    r,err := zip.OpenReader(src)
    if err != nil {
        return err
    }
    defer r.Close()

    for _,f := range r.File {
        rc,err := f.Open()
        if err != nil {
            return err
        }
        defer rc.Close()

        path := filepath.Join(dest,f.Name)
        if f.FileInfo().IsDir() {
            os.MkdirAll(path,f.Mode())
        } else {
            f,err := os.OpenFile(
                path,os.O_WRONLY|os.O_CREATE|os.O_TRUNC,f.Mode())
            if err != nil {
                return err
            }
            defer f.Close()

            _,err = io.Copy(f,rc)
            if err != nil {
                return err
            }
        }
    }

    return nil
}
OP的解决方案的轻微返工创建包含目录dest(如果不存在),并将文件提取/写入包装在一个关闭中,以消除每个 @Nick Craig-Wood的注释中的defer.Close()调用的堆叠:
func Unzip(src,err := zip.OpenReader(src)
    if err != nil {
        return err
    }
    defer func() {
        if err := r.Close(); err != nil {
            panic(err)
        }
    }()

    os.MkdirAll(dest,0755)

    // Closure to address file descriptors issue with all the deferred .Close() methods
    extractAndWriteFile := func(f *zip.File) error {
        rc,err := f.Open()
        if err != nil {
            return err
        }
        defer func() {
            if err := rc.Close(); err != nil {
                panic(err)
            }
        }()

        path := filepath.Join(dest,f.Name)

        if f.FileInfo().IsDir() {
            os.MkdirAll(path,f.Mode())
        } else {
            os.MkdirAll(filepath.Dir(path),f.Mode())
            f,err := os.OpenFile(path,f.Mode())
            if err != nil {
                return err
            }
            defer func() {
                if err := f.Close(); err != nil {
                    panic(err)
                }
            }()

            _,rc)
            if err != nil {
                return err
            }
        }
        return nil
    }

    for _,f := range r.File {
        err := extractAndWriteFile(f)
        if err != nil {
            return err
        }
    }

    return nil
}

注意:更新以包括Close()错误处理(如果我们正在寻找最佳实践,也可以遵循所有这些操作)。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读