Tôi muốn viết một công cụ tar_gz trong Go. Đầu vào là giống như lệnh linux:làm thế nào để viết một thư mục [không chỉ các tập tin trong nó] vào một tập tin tar.gz trong golang
$tar czvf targetFileName inputDirectoryPath
Giả sử tôi đã một inputDirectory có cấu trúc như sau:
test [dir]
-- 0.txt
-- 1 [sub dir]
-- 1.txt
Ví dụ: sử dụng lệnh:
$tar czvf test.tar.gz test/
chúng ta có thể tar và gzip sự toàn bộ thư mục kiểm tra.
Vấn đề của tôi là tôi có thể viết một tuyến đường tar và gz để đệ quy lặp lại tất cả tệp trong thư mục kiểm tra và ghi tệp đó vào tệp test.tar.gz. Nhưng tôi không biết cách viết một thư mục vào test.tar.gz. Sau khi chạy chương trình của tôi, cấu trúc trong test.tar.gz tập tin là:
0.txt
1.txt
bất cứ ai có thể cho tôi biết làm thế nào để viết thư mục đệ quy đến tập tin đầu ra tar.gz. Cảm ơn rất nhiều.
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")
}
Hơn ks rất nhiều. Nó hoạt động. – MadCrazy