Goにtar_gzツールを書きたいと思います。入力は、単にLinuxのコマンドのようなものです。例えばgolangのtar.gzファイルに[ファイルだけでなく]ディレクトリを書き込む方法
test [dir]
-- 0.txt
-- 1 [sub dir]
-- 1.txt
:コマンドを使用します。
$tar czvf test.tar.gz test/
を、私たちは、tarとgzip圧縮することができます
$tar czvf targetFileName inputDirectoryPath
は、私は以下のようにinputDirectoryを構造化していると仮定しますテストディレクトリ全体。
私の問題は、テストディレクトリ内のすべてのファイルを再帰的に反復してtest.tar.gzファイルに書き込むための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")
}
より多くのks。できます。 – MadCrazy