我想在Go中编写一个tar_gz工具.输入就像
linux命令:
$tar czvf targetFileName inputDirectoryPath
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,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
原文地址:https://www.jb51.cc/go/186876.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。