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

}

golang 7z压缩并设置压缩率 代码

原文地址: https://www.cveoy.top/t/topic/bEzB 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录