加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何将目录[不仅仅是其中的文件]写入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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读