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")
}

注意事项

  1. go-unarr 只支持解压,不支持创建压缩文件
  2. 对于加密文件,需要先调用 SetPassword() 方法
  3. 处理大文件时,建议使用缓冲区
  4. 某些 RAR 版本可能不完全支持

性能考虑

  • 对于 ZIP 文件,原生 Go 的 archive/zip 包可能性能更好
  • go-unarr 的优势在于支持多种格式的统一接口
  • 对于大批量小文件,可以预先调用 List() 然后批量处理

go-unarr 是一个简单实用的多格式解压库,特别适合需要处理多种压缩格式的项目。

回到顶部