add: 文件工具tar压缩

This commit is contained in:
TsMask
2024-10-12 19:04:48 +08:00
parent ee93b68683
commit 94bba0c910

View File

@@ -0,0 +1,76 @@
package file
import (
"archive/tar"
"compress/gzip"
"io"
"os"
"path/filepath"
)
// CompressTarGZByDir 将目录下文件添加到 tar.gz 压缩文件
func CompressTarGZByDir(zipFilePath, dirPath string) error {
// 创建本地输出目录
if err := os.MkdirAll(filepath.Dir(zipFilePath), 0775); err != nil {
return err
}
// 创建输出文件
tarFile, err := os.Create(zipFilePath)
if err != nil {
return err
}
defer tarFile.Close()
gw := gzip.NewWriter(tarFile)
defer gw.Close()
tw := tar.NewWriter(gw)
defer tw.Close()
// 遍历目录下的所有文件和子目录
err = filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
// 忽略目录
if info.IsDir() {
return nil
}
// 创建文件条目
header, err := tar.FileInfoHeader(info, "")
if err != nil {
return err
}
relPath, err := filepath.Rel(dirPath, path)
if err != nil {
return err
}
header.Name = relPath
if err := tw.WriteHeader(header); err != nil {
return err
}
if !info.Mode().IsRegular() {
return nil
}
// 打开文件
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
// 写入文件内容
_, err = io.Copy(tw, file)
if err != nil {
return err
}
return nil
})
return err
}