在Go语言中,可以使用标准库archive/tar配合其他库(如compress/gzip或compress/bzip2)来创建.tar、.tar.gz或.tar.bz2等类型的压缩包。以下是一个示例,演示如何创建一个包含若干文件和目录的.tar或.tar.gz文件:
go
package main
import (
"archive/tar"
"compress/gzip"
"fmt"
"io"
"os"
"path/filepath"
)
func createTarGz(sourceDir string, destFilePath string) error {
// 创建目标文件并准备gzip写入器
file, err := os.Create(destFilePath)
if err != nil {
return fmt.Errorf("failed to create output file: %w", err)
}
defer file.Close()
gzw := gzip.NewWriter(file)
defer gzw.Close()
tw := tar.NewWriter(gzw)
defer tw.Close()
// 遍历源目录下的文件和子目录
err = filepath.Walk(sourceDir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return fmt.Errorf("error walking path %q: %w", path, err)
}
// 跳过源目录本身
if path == sourceDir {
return nil
}
header, err := tar.FileInfoHeader(info, "")
if err != nil {
return fmt.Errorf("failed to create tar header for %q: %w", path, err)
}
// 修正相对路径
header.Name = strings.TrimPrefix(path, sourceDir+string(os.PathSeparator))
if err := tw.WriteHeader(header); err != nil {
return fmt.Errorf("failed to write tar header for %q: %w", path, err)
}
if !info.IsDir() {
file, err := os.Open(path)
if err != nil {
return fmt.Errorf("failed to open file %q: %w", path, err)
}
defer file.Close()
if _, err := io.Copy(tw, file); err != nil {
return fmt.Errorf("failed to copy file content for %q: %w", path, err)
}
}
return nil
})
if err != nil {
return fmt.Errorf("error creating tar archive: %w", err)
}
return nil
}
func main() {
sourceDir := "source/"
destFilePath := "archive.tar.gz"
err := createTarGz(sourceDir, destFilePath)
if err != nil {
fmt.Println("Error creating tar.gz:", err)
} else {
fmt.Println("Tar.gz creation successful.")
}
}
这个示例定义了一个名为createTarGz的函数,它接受一个源目录路径和一个目标.tar.gz文件路径作为参数。函数首先创建目标文件并准备好gzip写入器,再在gzip写入器之上创建tar写入器。
接着,使用filepath.Walk遍历源目录及其所有子目录和文件。对于每个文件或目录,创建相应的tar.Header,并根据相对源目录的路径修正其名称。然后,向tar写入器写入头信息。对于文件,还需要打开文件并将其内容复制到tar写入器。
在main函数中,调用createTarGz函数处理指定的源目录,并将压缩结果保存到指定的.tar.gz文件。如果压缩过程中发生错误,程序将打印错误信息;否则,显示压缩成功的消息。
这个示例涵盖了基本的.tar和.tar.gz文件创建逻辑。在实际使用时,可以根据需要进行错误处理、权限设置等方面的优化。如果要创建.tar.bz2文件,只需替换为使用compress/bzip2库并相应调整压缩逻辑即可。
749

被折叠的 条评论
为什么被折叠?



