用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()错误处理(如果我们正在寻找最佳实践,也可以遵循所有这些操作)。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |