有没有一个简单的方式来解压文件与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 }