A short program to show how to write TAR-GZ and TAR-XZ (LZMA) archives. Note that I have not included an example for TAR-BZ2 because there is no easily-findable public library for doing so.
package main
import (
"archive/tar"
"compress/gzip"
"fmt"
"os"
"io"
"time"
"github.com/ulikunitz/xz"
)
func addFile(tw *tar.Writer, filepath string) {
data := fmt.Sprintf("I am data: %s\n", filepath)
h := new(tar.Header)
h.Name = filepath
h.Size = int64(len(data))
h.Mode = int64(0666)
h.ModTime = time.Now()
// write the header to the tarball archive
if err := tw.WriteHeader(h); err != nil {
panic(err)
}
// copy the file data to the tarball
if _, err := io.WriteString(tw, data); err != nil {
panic(err)
}
}
func createTarGz() {
f, err := os.Create("output.tar.gz")
if err != nil {
panic(err)
}
defer f.Close()
gw := gzip.NewWriter(f)
defer gw.Close()
tw := tar.NewWriter(gw)
defer tw.Close()
addFile(tw, "aa")
addFile(tw, "bb/cc")
}
func createTarXz() {
f, err := os.Create("output.tar.xz")
if err != nil {
panic(err)
}
defer f.Close()
xw, err := xz.NewWriter(f)
if err != nil {
panic(err)
}
defer xw.Close()
tw := tar.NewWriter(xw)
defer tw.Close()
addFile(tw, "dd")
addFile(tw, "ee/ff")
}
func main() {
createTarGz()
createTarXz()
}
Examine the outputs:
$ tar tzf output.tar.gz aa bb/cc $ tar xz -O - -f output.tar.gz aa I am data: aa $ tar xz -O - -f output.tar.gz bb/cc I am data: bb/cc $ tar tJf output.tar.xz dd ee/ff I am data: bb/cc $ tar xJ -O - -f output.tar.xz dd I am data: dd $ tar xJ -O - -f output.tar.xz ee/ff I am data: ee/ff