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 }