package zip import ( "archive/zip" "io" "os" "git.sa-roci.de/oss/go_zipper" ) // NewUnzipper makes a new Unzipper. func NewUnzipper(zipFilename string) zipper.Unzipper { uz := zUnzipper{ Unzipper: zipper.NewBaseUnzipper(zipFilename), } uz.SetDecompressor(uz) return uz } type zUnzipper struct { zipper.Unzipper } func (uz zUnzipper) OpenReader(zipFile *os.File) (err error) { var reader *zip.ReadCloser if reader, err = zip.OpenReader(zipFile.Name()); err == nil { uz.SetReader(reader) } return } func (uz zUnzipper) Decompress(targetFolderPathInFileSystem string) (err error) { if zipReader, ok := uz.GetReader().(*zip.ReadCloser); ok { if err = zipper.MakeSurePathExists(targetFolderPathInFileSystem+"/dummy.file", 0644); err == nil { for _, entry := range zipReader.File { outputPath := zipper.PrependPath(entry.Name, targetFolderPathInFileSystem) if !entry.FileInfo().IsDir() { if err = zipper.MakeSurePathExists(outputPath, 0644); err == nil { var dstFile *os.File if dstFile, err = os.OpenFile(outputPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, entry.Mode()); err == nil { defer dstFile.Close() var archivedFileData io.ReadCloser if archivedFileData, err = entry.Open(); err == nil { defer archivedFileData.Close() _, err = io.Copy(dstFile, archivedFileData) } } } } else { err = zipper.MakeSurePathExists(outputPath+"/dummy.file", 0644) } if err != nil { break } } } } return }