From 0acae49a22e742edea70668fcc07e5f8d0a3abf4 Mon Sep 17 00:00:00 2001 From: mountain Date: Wed, 24 May 2023 18:38:12 +0900 Subject: [PATCH] =?UTF-8?q?=EC=95=95=EC=B6=95=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compress.go | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 compress.go diff --git a/compress.go b/compress.go new file mode 100644 index 0000000..9d085b9 --- /dev/null +++ b/compress.go @@ -0,0 +1,101 @@ +package common + +import ( + "archive/tar" + "archive/zip" + "errors" + "io" + "os" + "path" + + "golang.org/x/text/encoding/korean" + "golang.org/x/text/transform" +) + +func Unzip(fname string) error { + archive, err := zip.OpenReader(fname) + if err != nil { + os.Remove(fname) + return err + } + defer archive.Close() + + verpath := path.Dir(fname) + for _, f := range archive.File { + var name string + if f.NonUTF8 { + name, _, _ = transform.String(korean.EUCKR.NewDecoder(), f.Name) + } else { + name = f.Name + } + + filePath := path.Join(verpath, name) + + if f.FileInfo().IsDir() { + os.MkdirAll(filePath, os.ModePerm) + continue + } + + if err := os.MkdirAll(path.Dir(filePath), os.ModePerm); err != nil { + return err + } + + dstFile, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) + if err != nil { + return err + } + + fileInArchive, err := f.Open() + if err != nil { + return err + } + + if _, err := io.Copy(dstFile, fileInArchive); err != nil { + return err + } + + dstFile.Close() + fileInArchive.Close() + } + return nil +} + +func Untar(fname string) error { + file, err := os.Open(fname) + if err != nil { + return err + } + defer file.Close() + + verpath := path.Dir(fname) + tarReader := tar.NewReader(file) + for { + header, err := tarReader.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + + switch header.Typeflag { + case tar.TypeDir: + if err := os.MkdirAll(path.Join(verpath, header.Name), 0755); err != nil { + return err + } + case tar.TypeReg: + fileWriter, err := os.Create(path.Join(verpath, header.Name)) + if err != nil { + return err + } + defer fileWriter.Close() + + if _, err := io.Copy(fileWriter, tarReader); err != nil { + return err + } + default: + return errors.New("unknown type") + } + } + return nil +}