go_zipper/zip/uncompress.go

61 lines
1.5 KiB
Go

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
}