61 lines
1.5 KiB
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
|
|
}
|