如何将目录[不仅仅是其中的文件]写入golang中的tar.gz文件
发布时间:2020-12-16 19:22:59 所属栏目:大数据 来源:网络整理
导读:我想在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整
我想在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... %sn",curPath ) TarGzWrite( curPath,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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |