golang - golang tar, gzip 압축 풀기, file compression, Decompressing
이 름 : 바다아이
|
조회수 : 10375
짧은 주소 : https://www.bada-ie.com/su/?951591783773
입맛에 맞게 고쳐 쓰세요...
퍼왔는데 부족한 부분이 있어서 좀 고쳤습니다.
tar 는 디렉토리를 묶는 거라고 보시면 되고.... (서브까지 다 묶습니다.)
gzip 은 한 개의 파일을 압축 또는 tar 로 묶은 한개의 파일을 압축합니다.
package main
import (
"archive/tar""compress/gzip""fmt""io""os""path/filepath""strings"
)
// The gzip file stores a header giving metadata about the compressed file.// That header is exposed as the fields of the Writer and Reader structs.//type Header struct {// Comment string // comment// Extra []byte // "extra data"// ModTime time.Time // modification time// Name string // file name// OS byte // operating system type//}
func gzipit(source, target string) error {
reader, err := os.Open(source)
iferr != nil {
returnerr
}
filename := filepath.Base(source)
target = filepath.Join(target, fmt.Sprintf("%s.gz", filename))
writer, err := os.Create(target)
iferr != nil {
returnerr
}
defer writer.Close()
archiver := gzip.NewWriter(writer)
archiver.Name = filename
defer archiver.Close()
_, err = io.Copy(archiver, reader)
returnerr
}
func ungzip(source, target string) error {
reader, err := os.Open(source)
iferr != nil {
returnerr
}
defer reader.Close()
archive, err := gzip.NewReader(reader)
iferr != nil {
returnerr
}
defer archive.Close()
target = filepath.Join(target, archive.Name)
writer, err := os.Create(target)
iferr != nil {
returnerr
}
defer writer.Close()
_, err = io.Copy(writer, archive)
returnerr
}
func tarit(source, target string) error {
filename := filepath.Base(source)
target = filepath.Join(target, fmt.Sprintf("%s.tar", filename))
tarfile, err := os.Create(target)
iferr != nil {
returnerr
}
defer tarfile.Close()
tarball := tar.NewWriter(tarfile)
defer tarball.Close()
return filepath.Walk(source,
func(path string, info os.FileInfo, errerror) error {
iferr != nil {
returnerr
}
header, err := tar.FileInfoHeader(info, info.Name())
iferr != nil {
returnerr
}
header.Name = filepath.Join("", strings.TrimPrefix(path, source))
iferr := tarball.WriteHeader(header); err != nil {
returnerr
}
if info.IsDir() {
return nil
}
file, err := os.Open(path)
iferr != nil {
returnerr
}
defer file.Close()
_, err = io.Copy(tarball, file)
returnerr
})
}
func untar(tarball, target string) error {
R:
reader, err := os.Open(tarball)
iferr != nil {
returnerr
}
defer reader.Close()
tarReader := tar.NewReader(reader)
var subDir []stringvar i int
for {
header, err := tarReader.Next()
iferr == io.EOF {
break
} elseiferr != nil {
returnerr
}
path := filepath.Join(target, header.Name)
info := header.FileInfo()
if info.IsDir() {
iferr = os.MkdirAll(path, info.Mode()); err != nil {
returnerr
}
if path != "." {
subDir = append(subDir, path)
}
continue
}
file, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, info.Mode())
iferr != nil {
returnerr
}
defer file.Close()
_, err = io.Copy(file, tarReader)
iferr != nil {
returnerr
}
}
if len(subDir) > 0 {
tarball = subDir[i]
target = subDir[i]
i++
goto R
}
return nil
}
func main() {
// 요놈은 파일을 하나하나 압축할 때 사용합니다. tar 로 묶어서 gzip 으로 압축하면 되겠네요...// gzipit("./a.tar", "./")// ungzip("./a.tar.gz", "./")// 요놈은 디렉토리 묶는 것에 사용합니다.// tarit("./a", "./")// untar("./a.tar", "./")
}
참고 : http://blog.ralch.com/tutorial/golang-working-with-tar-and-gzip/
|
|
번 호
카테고리
제 목
이름
조회수
Copyright ⓒ 2001.12. bada-ie.com. All rights reserved.
이 사이트는 리눅스에서 firefox 기준으로 작성되었습니다. 기타 브라우저에서는 다르게 보일 수 있습니다.
[ Ubuntu + GoLang + PostgreSQL + Mariadb ]
서버위치 : 오라클 클라우드 춘천 실행시간 : 0.28207 초 to webmaster... gogo sea. gogo sea.