gpt4 book ai didi

go - 如何将目录[不仅仅是其中的文件]写入golang中的tar.gz文件

转载 作者:IT老高 更新时间:2023-10-28 13:10:02 25 4
gpt4 key购买 nike

我想用 Go 写一个 tar_gz 工具。输入就像linux命令:

$tar czvf targetFileName inputDirectoryPath

假设我的 inputDirectory 结构如下:

test [dir]
-- 0.txt
-- 1 [sub dir]
-- 1.txt

例如:使用命令:

$tar czvf test.tar.gz test/

我们可以 tar 和 gzip 整个测试目录。


我的问题是我可以编写一个 tar 和 gz 路由来递归迭代测试目录中的所有文件并将文件写入 test.tar.gz 文件。但是我不知道如何将目录写入test.tar.gz。运行我的程序后,test.tar.gz 文件中的结构是:

0.txt
1.txt

谁能告诉我如何将目录递归写入输出 tar.gz 文件。非常感谢。

    package main

import (
"fmt"
"os"
"io"
"log"
"strings"
"archive/tar"
"compress/gzip"
)

func handleError( _e error ) {
if _e != nil {
log.Fatal( _e )
}
}

func TarGzWrite( _path string, tw *tar.Writer, fi os.FileInfo ) {
fr, err := os.Open( _path )
handleError( err )
defer fr.Close()

h := new( tar.Header )
h.Name = fi.Name()
h.Size = fi.Size()
h.Mode = int64( fi.Mode() )
h.ModTime = fi.ModTime()

err = tw.WriteHeader( h )
handleError( err )

_, err = io.Copy( tw, fr )
handleError( err )
}

func IterDirectory( dirPath string, tw *tar.Writer ) {
dir, err := os.Open( dirPath )
handleError( err )
defer dir.Close()
fis, err := dir.Readdir( 0 )
handleError( err )
for _, fi := range fis {
curPath := dirPath + "/" + fi.Name()
if fi.IsDir() {
//TarGzWrite( curPath, tw, fi )
IterDirectory( curPath, tw )
} else {
fmt.Printf( "adding... %s\n", curPath )
TarGzWrite( curPath, tw, fi )
}
}
}

func TarGz( outFilePath string, inPath string ) {
// file write
fw, err := os.Create( outFilePath )
handleError( err )
defer fw.Close()

// gzip write
gw := gzip.NewWriter( fw )
defer gw.Close()

// tar write
tw := tar.NewWriter( gw )
defer tw.Close()

IterDirectory( inPath, tw )

fmt.Println( "tar.gz ok" )
}

func main() {
targetFilePath := "test.tar.gz"
inputDirPath := "test/"
TarGz( targetFilePath, strings.TrimRight( inputDirPath, "/" ) )
fmt.Println( "Hello, World" )
}

最佳答案

您只是将文件名添加到 tar,而不是整个路径。您需要保留 Tar 能够理解目录的整个路径。您只需要更改一行:

h.Name = fi.Name()

应该是:

h.Name = _path

在Linux上,tar -tvf test.tar.gz的输出:

-rw-rw-r-- 0/0               0 2012-11-28 11:17 test/0.txt
-rw-rw-r-- 0/0 0 2012-11-28 11:17 test/sub/1.txt

关于go - 如何将目录[不仅仅是其中的文件]写入golang中的tar.gz文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13611100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com