|
|
@ -305,3 +305,87 @@ func DecompressZip(zpFname string) error { |
|
|
} |
|
|
} |
|
|
return nil |
|
|
return nil |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// dest:目的地址以及压缩文件名 eg:/data/logZip/2022-12-12-log.zip
|
|
|
|
|
|
// paths:需要压缩的所有文件所组成的集合
|
|
|
|
|
|
func CompressToZip(dest string, currentPath string, paths []string) error { |
|
|
|
|
|
// fmt.Println("real path", currentPath)
|
|
|
|
|
|
// 打开files 目录
|
|
|
|
|
|
filesPath := "" |
|
|
|
|
|
if dir, err := os.Getwd(); err == nil { |
|
|
|
|
|
filesPath = dir + "/files/" |
|
|
|
|
|
} |
|
|
|
|
|
if err := os.MkdirAll(filesPath, 0755); err != nil { |
|
|
|
|
|
fmt.Println(err.Error()) |
|
|
|
|
|
} |
|
|
|
|
|
// ToSlash 过滤windows的斜杠引起的bug
|
|
|
|
|
|
zfile, err := os.Create(path.Join("./files", "/", dest)) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return err |
|
|
|
|
|
} |
|
|
|
|
|
defer zfile.Close() |
|
|
|
|
|
zipWriter := zip.NewWriter(zfile) |
|
|
|
|
|
defer zipWriter.Close() |
|
|
|
|
|
|
|
|
|
|
|
// 遍历带压缩的目录信息
|
|
|
|
|
|
for _, src := range paths { |
|
|
|
|
|
// 替换文件名,并且去除前后 "\" 或 "/"
|
|
|
|
|
|
// path = strings.Trim(path, string(filepath.Separator))
|
|
|
|
|
|
// 从配置中读取到源目录
|
|
|
|
|
|
src = path.Join(currentPath, "/", src) |
|
|
|
|
|
// 删除尾随路径(如果它是目录)
|
|
|
|
|
|
src := strings.TrimSuffix(src, string(os.PathSeparator)) |
|
|
|
|
|
// 文件遍历
|
|
|
|
|
|
err = filepath.Walk(src, func(path string, info os.FileInfo, err error) error { |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return err |
|
|
|
|
|
} |
|
|
|
|
|
// 创建本地文件头
|
|
|
|
|
|
header, err := zip.FileInfoHeader(info) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 监听的工作目录作为文件的结尾,然后取相对路径
|
|
|
|
|
|
// 在zip存档中设置文件的相对路径
|
|
|
|
|
|
header.Name, err = filepath.Rel(filepath.Dir(config.G.FilePath), path) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 转换为Unix风格的路径分隔符
|
|
|
|
|
|
header.Name = filepath.ToSlash(header.Name) |
|
|
|
|
|
|
|
|
|
|
|
// 目录需要拼上一个 "/" ,否则会出现一个和目录一样的文件在压缩包中
|
|
|
|
|
|
if info.IsDir() { |
|
|
|
|
|
header.Name += "/" |
|
|
|
|
|
} else { |
|
|
|
|
|
// 将压缩方法设置为deflate
|
|
|
|
|
|
header.Method = zip.Deflate |
|
|
|
|
|
} |
|
|
|
|
|
// fmt.Printf("zip header:%v\n", header.Name)
|
|
|
|
|
|
// 创建写入头的writer
|
|
|
|
|
|
headerWriter, err := zipWriter.CreateHeader(header) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return err |
|
|
|
|
|
} |
|
|
|
|
|
if info.IsDir() { |
|
|
|
|
|
return nil |
|
|
|
|
|
} |
|
|
|
|
|
f, err := os.Open(path) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return err |
|
|
|
|
|
} |
|
|
|
|
|
defer f.Close() |
|
|
|
|
|
_, err = io.Copy(headerWriter, f) |
|
|
|
|
|
return err |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return err |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
// 存到指定位置
|
|
|
|
|
|
os.Rename(dest, path.Join("./sync_zips/", dest)) |
|
|
|
|
|
return nil |
|
|
|
|
|
} |
|
|
|