golang支持RAR/TAR/ZIP/7z多种压缩格式解压的插件库go-unarr的使用
go-unarr - Golang支持RAR/TAR/ZIP/7z多种压缩格式解压的插件库
概述
go-unarr是一个Golang绑定库,基于sumatrapdf的unarr库实现。unarr是一个解压缩库和CLI工具,支持RAR、TAR、ZIP和7z等多种压缩格式。
安装库
go get -v github.com/gen2brain/go-unarr
使用示例
打开压缩文件
a, err := unarr.NewArchive("test.7z")
if err != nil {
panic(err)
}
defer a.Close()
读取压缩包中的第一个文件
err := a.Entry()
if err != nil {
panic(err)
}
data, err := a.ReadAll()
if err != nil {
panic(err)
}
列出压缩包内容
list, err := a.List()
if err != nil {
panic(err)
}
读取压缩包中指定文件
err := a.EntryFor("filename.txt")
if err != nil {
panic(err)
}
data, err := a.ReadAll()
if err != nil {
panic(err)
}
读取文件前8字节
err := a.Entry()
if err != nil {
panic(err)
}
data := make([]byte, 8)
n, err := a.Read(data)
if err != nil {
panic(err)
}
读取压缩包中所有文件
for {
err := a.Entry()
if err != nil {
if err == io.EOF {
break
} else {
panic(err)
}
}
data, err := a.ReadAll()
if err != nil {
panic(err)
}
}
解压到指定目录
_, err := a.Extract("/tmp/path")
if err != nil {
panic(err)
}
CLI工具使用
安装CLI工具
go install github.com/gen2brain/go-unarr/cmd/unarr@latest
使用示例
unarr ./example.7z ./example/
构建CLI工具
一次性构建:
go build -o ./unarr ./cmd/unarr/*.go
跨平台构建:
goreleaser --snapshot --skip-publish --rm-dist
构建标签
extlib
- 使用外部libunarr库pkgconfig
- 启用pkg-config(与extlib
一起使用)static
- 使用静态库(与pkgconfig
一起使用)
这个库提供了简单易用的API来处理多种压缩格式,是Golang项目中处理压缩文件的理想选择。
更多关于golang支持RAR/TAR/ZIP/7z多种压缩格式解压的插件库go-unarr的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang支持RAR/TAR/ZIP/7z多种压缩格式解压的插件库go-unarr的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
go-unarr: Golang 多格式压缩文件解压库
go-unarr 是一个基于 C 库 unarr 的 Go 语言绑定,支持解压 RAR、TAR、ZIP 和 7z 等多种压缩格式。它提供了简单易用的 API 来处理压缩文件。
安装
首先需要安装 go-unarr:
go get github.com/gen2brain/go-unarr
基本用法
1. 列出压缩文件内容
package main
import (
"fmt"
"github.com/gen2brain/go-unarr"
)
func main() {
a, err := unarr.NewArchive("example.zip")
if err != nil {
panic(err)
}
defer a.Close()
list, err := a.List()
if err != nil {
panic(err)
}
for _, file := range list {
fmt.Println(file)
}
}
2. 解压单个文件
package main
import (
"fmt"
"io"
"os"
"github.com/gen2brain/go-unarr"
)
func main() {
a, err := unarr.NewArchive("example.zip")
if err != nil {
panic(err)
}
defer a.Close()
// 解压特定文件
err = a.EntryFor("path/to/file.txt")
if err != nil {
panic(err)
}
// 创建目标文件
out, err := os.Create("output.txt")
if err != nil {
panic(err)
}
defer out.Close()
// 复制文件内容
_, err = io.Copy(out, a)
if err != nil {
panic(err)
}
fmt.Println("File extracted successfully")
}
3. 解压全部文件
package main
import (
"fmt"
"os"
"path/filepath"
"github.com/gen2brain/go-unarr"
)
func main() {
a, err := unarr.NewArchive("example.zip")
if err != nil {
panic(err)
}
defer a.Close()
list, err := a.List()
if err != nil {
panic(err)
}
// 创建输出目录
err = os.MkdirAll("output", 0755)
if err != nil {
panic(err)
}
for _, file := range list {
err = a.EntryFor(file)
if err != nil {
fmt.Printf("Failed to extract %s: %v\n", file, err)
continue
}
path := filepath.Join("output", file)
err = os.MkdirAll(filepath.Dir(path), 0755)
if err != nil {
fmt.Printf("Failed to create directory for %s: %v\n", file, err)
continue
}
out, err := os.Create(path)
if err != nil {
fmt.Printf("Failed to create %s: %v\n", file, err)
continue
}
_, err = out.ReadFrom(a)
out.Close()
if err != nil {
fmt.Printf("Failed to extract %s: %v\n", file, err)
continue
}
fmt.Printf("Extracted: %s\n", file)
}
}
高级功能
1. 密码保护的压缩文件
package main
import (
"fmt"
"github.com/gen2brain/go-unarr"
)
func main() {
a, err := unarr.NewArchive("protected.zip")
if err != nil {
panic(err)
}
defer a.Close()
// 设置密码
a.SetPassword("secret")
// 验证密码是否正确
valid, err := a.EntryFor("file.txt")
if err != nil || !valid {
fmt.Println("Invalid password or file not found")
return
}
fmt.Println("Password correct, file can be extracted")
}
2. 处理大文件
package main
import (
"fmt"
"io"
"os"
"github.com/gen2brain/go-unarr"
)
func extractLargeFile(a *unarr.Archive, filename, outputPath string) error {
err := a.EntryFor(filename)
if err != nil {
return err
}
out, err := os.Create(outputPath)
if err != nil {
return err
}
defer out.Close()
// 使用缓冲区处理大文件
buf := make([]byte, 32*1024) // 32KB 缓冲区
_, err = io.CopyBuffer(out, a, buf)
return err
}
func main() {
a, err := unarr.NewArchive("largefile.rar")
if err != nil {
panic(err)
}
defer a.Close()
err = extractLargeFile(a, "bigfile.bin", "bigfile.bin")
if err != nil {
panic(err)
}
fmt.Println("Large file extracted successfully")
}
注意事项
- go-unarr 只支持解压,不支持创建压缩文件
- 对于加密文件,需要先调用
SetPassword()
方法 - 处理大文件时,建议使用缓冲区
- 某些 RAR 版本可能不完全支持
性能考虑
- 对于 ZIP 文件,原生 Go 的
archive/zip
包可能性能更好 - go-unarr 的优势在于支持多种格式的统一接口
- 对于大批量小文件,可以预先调用
List()
然后批量处理
go-unarr 是一个简单实用的多格式解压库,特别适合需要处理多种压缩格式的项目。