使用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如果不存在),并将文件提取/写入包装在闭包中,以消除defer .Close()每个@NickCraig-Wood注释的调用堆积:

func Unzip(src, dest string) error {

r, 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, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())

if err != nil {

return err

}

defer func() {

if err := f.Close(); err != nil {

panic(err)

}

}()

_, err = io.Copy(f, rc)

if err != nil {

return err

}

}

return nil

}

for _, f := range r.File {

err := extractAndWriteFile(f)

if err != nil {

return err

}

}

return nil

}

更新后还包括Close()错误处理(如果我们正在寻找最佳实践,则不妨遵循所有最佳实践)。

以上是 使用golang解压缩文件的简便方法 的全部内容, 来源链接: utcz.com/qa/427027.html

回到顶部