프로그래밍 검색 블로그

go 파일 압축 본문

go

go 파일 압축

코딩조무사 2018. 5. 12. 16:54


package main

import (
	"archive/zip"
	"io"
	"io/ioutil"
	"os"
	"path/filepath"
)

// ZipDir 폴더를 지정해서 그 폴더 안에 있는 파일들을
// saveFile에 저장합니다
// error nil 압축성공
// 그외: 압축 실패
func ZipDir(saveFile *os.File, savePath string) error {
	zipWriter := zip.NewWriter(saveFile)
	defer zipWriter.Close()
	z := zipType{zipWriter}
	return z.dir(savePath, "")
}

func main() {
	//실행 파일과 같은 위치에 있는 test폴더 안에 있는 요소를
	//result.zip으로 압축합니다.

	newfile, err := os.Create("result.zip")
	if err != nil {
		panic(err)
	}

	ZipDir(newfile, "test")
}

type zipType struct {
	writer *zip.Writer
}

//dir 폴더 안을 zip 안에 넣기 위해서 dir과 다른 경로를 가짐
func (z zipType) dir(dirPath string, zipPath string) error {
	files, err := ioutil.ReadDir(dirPath)
	if err != nil {
		return err
	}
	for _, file := range files {
		fullPath := dirPath + string(filepath.Separator) + file.Name()
		if file.IsDir() {
			if err != nil {
				return err
			}
			z.dir(fullPath, zipPath+file.Name()+string(filepath.Separator))
		} else {
			if err := z.file(file, fullPath, zipPath); err != nil {
				return err
			}
		}
	}
	return nil
}

func (z zipType) file(file os.FileInfo, filePath string, zipPath string) error {
	header, _ := zip.FileInfoHeader(file)
	header.Name = zipPath + header.Name

	w, err := z.writer.CreateHeader(header)
	if err != nil {
		return err
	}
	f, err := os.Open(filePath)
	if err != nil {
		return err
	}
	defer f.Close()
	io.Copy(w, f)

	return nil
}


'go' 카테고리의 다른 글

go context Timeout, deadline  (0) 2018.12.22
go AES 암호화  (0) 2018.05.22
go reflect 호출  (0) 2018.05.15
Comments