对文件进行压缩,同时考虑了Linux 和 Wins 目录差异
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | func main() { srcDir:="E:/xx/v1" zipFileName:="E:/xx/v1_zip.zip" Zip(srcDir, zipFileName) } // 打包成zip文件 func Zip(src_dir string, zip_file_name string) { // 预防:旧文件无法覆盖 os.RemoveAll(zip_file_name) // 创建:zip文件 zipfile, _ := os.Create(zip_file_name) defer zipfile.Close() // 打开:zip文件 archive := zip.NewWriter(zipfile) defer archive.Close() // 遍历路径信息 filepath.Walk(src_dir, func(path string, info os.FileInfo, _ error) error { // 如果是源路径,提前进行下一个遍历 if path == src_dir { return nil } header, _ := zip.FileInfoHeader(info) path=strings.ReplaceAll(path,"\","/") // 对同时兼容Linux 和 win 进行处理 header.Name = strings.TrimPrefix(path, src_dir) // +`/` beego.Info(header.Name,path,src_dir) // pictures\10.jpg E:xx\V1\pictures\10.jpg E:\xx\V1 // 判断:文件是不是文件夹 if info.IsDir() { header.Name += `/` } else { // 设置:zip的文件压缩算法 header.Method = zip.Deflate } // 创建:压缩包头部信息 writer, _ := archive.CreateHeader(header) if !info.IsDir() { file, _ := os.Open(path) defer file.Close() io.Copy(writer, file) } return nil }) } |