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 }