12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- package assist
- import (
- baseZip "archive/zip"
- "io"
- "os"
- )
- // ZipCompress 压缩文件
- // files 文件数组,可以是不同dir下的文件或者文件夹
- // dest 压缩文件存放地址
- func ZipCompress(files []*os.File, dest string) error {
- // 创建压缩文件
- d, _ := os.Create(dest)
- defer d.Close()
- // NewWriter创建并返回一个将zip文件写入w的*Writer。
- w := baseZip.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 *baseZip.Writer) error {
- info, err := file.Stat()
- if err != nil {
- return err
- }
- if info.IsDir() {
- if len(prefix) == 0 {
- prefix = info.Name()
- } else {
- 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 {
- // FileInfoHeader返回一个根据fi填写了部分字段的Header。
- header, err := baseZip.FileInfoHeader(info)
- if len(prefix) != 0 {
- header.Name = prefix + "/" + header.Name
- }
- if err != nil {
- return err
- }
- // 使用给出的*FileHeader来作为文件的元数据添加一个文件进zip文件。
- writer, err := zw.CreateHeader(header)
- if err != nil {
- return err
- }
- // 将文件复制到目标
- _, err = io.Copy(writer, file)
- file.Close()
- if err != nil {
- return err
- }
- }
- return nil
- }
|