用golang解压文件的简单方法

前端之家收集整理的这篇文章主要介绍了用golang解压文件的简单方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有一个简单的方式来解压文件与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()错误处理(如果我们正在寻找最佳实践,也可以遵循所有这些操作)。

猜你在找的Go相关文章