golang 7z压缩并设置压缩率 代码
package main
import ( "archive/zip" "bufio" "compress/flate" "io" "log" "os" "path/filepath"
"github.com/kjk/lzma"
)
func main() { // 压缩文件夹 err := CompressFolder("test", "test.7z", 9) if err != nil { log.Fatal(err) } }
// CompressFolder 压缩文件夹 func CompressFolder(src string, dst string, level int) error { // 创建压缩文件 fw, err := os.Create(dst) if err != nil { return err } defer fw.Close()
// 创建 zip.Writer
writer := lzma.NewWriterLevel(fw, level)
// 设置压缩算法
writer.UseCRC32(true)
writer.Multithreading = true
// 遍历文件夹
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
}
header.Name = filepath.ToSlash(path)
// 判断文件是否为文件夹
if info.IsDir() {
header.Name += "/"
header.Method = zip.Store
} else {
header.Method = zip.Deflate
header.Flags |= 1 << 11 // 设置数据描述符标志位
}
// 写入文件头信息
writer.WriteHeader(header)
// 处理文件内容
if !info.IsDir() {
fr, err := os.Open(path)
if err != nil {
return err
}
defer fr.Close()
// 设置压缩等级
writer.SetLevel(level)
// 使用 bufio 加速读取
br := bufio.NewReader(fr)
if info.Size() > 0 {
// 压缩文件
wc, err := writer.Create(header.Name)
if err != nil {
return err
}
_, err = io.Copy(wc, br)
if err != nil {
return err
}
}
}
return nil
})
if err != nil {
return err
}
// 关闭 zip.Writer
err = writer.Close()
if err != nil {
return err
}
return nil
}
原文地址: https://www.cveoy.top/t/topic/bEzB 著作权归作者所有。请勿转载和采集!