github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/archive/kmgTar/kmgTar.go (about)

     1  package kmgTar
     2  
     3  import (
     4  	"archive/tar"
     5  	"compress/gzip"
     6  	"io"
     7  	"os"
     8  	"path/filepath"
     9  )
    10  
    11  //package a directory into a tar format.
    12  func PackageDirectoryTar(root string, inW io.Writer) (err error) {
    13  	tarW := tar.NewWriter(inW)
    14  	defer tarW.Close()
    15  	err = filepath.Walk(root, func(path string, info os.FileInfo, inErr error) (err error) {
    16  		if inErr != nil {
    17  			return inErr
    18  		}
    19  		h, err := tar.FileInfoHeader(info, "")
    20  		if err != nil {
    21  			return
    22  		}
    23  		relPath, err := filepath.Rel(root, path)
    24  		if err != nil {
    25  			return
    26  		}
    27  		h.Name = filepath.ToSlash(relPath)
    28  		err = tarW.WriteHeader(h)
    29  		if err != nil {
    30  			return
    31  		}
    32  		if info.IsDir() {
    33  			return
    34  		}
    35  		f, err := os.Open(path)
    36  		if err != nil {
    37  			return
    38  		}
    39  		defer f.Close()
    40  		_, err = io.Copy(tarW, f)
    41  		if err != nil {
    42  			return
    43  		}
    44  		return
    45  	})
    46  	return
    47  }
    48  
    49  //package a directory into a tar.gz format.
    50  func PackageDirectoryTarGz(root string, w io.Writer) (err error) {
    51  	gzipW := gzip.NewWriter(w)
    52  	defer gzipW.Close()
    53  	err = PackageDirectoryTar(root, gzipW)
    54  	return
    55  }