| | |
| | | package util |
| | | |
| | | import ( |
| | | "archive/zip" |
| | | "io" |
| | | "os" |
| | | "strings" |
| | | ) |
| | | |
| | | //压缩文件 |
| | | //files 文件数组,可以是不同dir下的文件或者文件夹 |
| | | //dest 压缩文件存放地址 |
| | | func Compress2Zip(files []*os.File, dest string) error { |
| | | d, _ := os.Create(dest) |
| | | defer d.Close() |
| | | w := zip.NewWriter(d) |
| | | defer w.Close() |
| | | for _, file := range files { |
| | | err := compress(file, "", w) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | } |
| | | return nil |
| | | } |
| | | |
| | | func compress(file *os.File, prefix string, zw *zip.Writer) error { |
| | | info, err := file.Stat() |
| | | if err != nil { |
| | | return err |
| | | } |
| | | if info.IsDir() { |
| | | prefix = prefix + "/" + info.Name() |
| | | fileInfos, err := file.Readdir(-1) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | for _, fi := range fileInfos { |
| | | f, err := os.Open(file.Name() + "/" + fi.Name()) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | err = compress(f, prefix, zw) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | } |
| | | } else { |
| | | header, err := zip.FileInfoHeader(info) |
| | | header.Name = prefix + "/" + header.Name |
| | | if err != nil { |
| | | return err |
| | | } |
| | | writer, err := zw.CreateHeader(header) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | _, err = io.Copy(writer, file) |
| | | file.Close() |
| | | if err != nil { |
| | | return err |
| | | } |
| | | } |
| | | return nil |
| | | } |
| | | |
| | | //解压 |
| | | func DeCompress(zipFile, dest string) error { |
| | | reader, err := zip.OpenReader(zipFile) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | defer reader.Close() |
| | | for _, file := range reader.File { |
| | | rc, err := file.Open() |
| | | if err != nil { |
| | | return err |
| | | } |
| | | defer rc.Close() |
| | | filename := dest + file.Name |
| | | err = os.MkdirAll(getDir(filename), 0755) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | w, err := os.Create(filename) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | defer w.Close() |
| | | _, err = io.Copy(w, rc) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | w.Close() |
| | | rc.Close() |
| | | } |
| | | return nil |
| | | } |
| | | |
| | | func getDir(path string) string { |
| | | return subString(path, 0, strings.LastIndex(path, "/")) |
| | | } |
| | | |
| | | func subString(str string, start, end int) string { |
| | | rs := []rune(str) |
| | | length := len(rs) |
| | | |
| | | if start < 0 || start > length { |
| | | panic("start is wrong") |
| | | } |
| | | |
| | | if end < start || end > length { |
| | | panic("end is wrong") |
| | | } |
| | | |
| | | return string(rs[start:end]) |
| | | } |
| | | |