是否可以在golang中提取tar.xz包?

时间:2015-01-31 08:42:06

标签: go xz

是否可以在golang中提取tar.xz包?我的理解是可以将库用于tar并将其发送到xz go库。

3 个答案:

答案 0 :(得分:3)

http://golang.org/pkg/archive/tar/#example_

你也可以做到

import "os/exec"

cmd := exec.Command("tar", "-x", "/your/archive.tar.xz")
err := cmd.Run()

答案 1 :(得分:2)

我最近创建了一个XZ decompression package,现在就是这样 可以仅使用Go代码提取tar.xz。

以下代码将文件myfile.tar.xz提取到当前 目录:

package main

import (
    "archive/tar"
    "fmt"
    "io"
    "log"
    "os"

    "github.com/xi2/xz"
)

func main() {
    // Open a file
    f, err := os.Open("myfile.tar.xz")
    if err != nil {
        log.Fatal(err)
    }
    // Create an xz Reader
    r, err := xz.NewReader(f, 0)
    if err != nil {
        log.Fatal(err)
    }
    // Create a tar Reader
    tr := tar.NewReader(r)
    // Iterate through the files in the archive.
    for {
        hdr, err := tr.Next()
        if err == io.EOF {
            // end of tar archive
            break
        }
        if err != nil {
            log.Fatal(err)
        }
        switch hdr.Typeflag {
        case tar.TypeDir:
            // create a directory
            fmt.Println("creating:   " + hdr.Name)
            err = os.MkdirAll(hdr.Name, 0777)
            if err != nil {
                log.Fatal(err)
            }
        case tar.TypeReg, tar.TypeRegA:
            // write a file
            fmt.Println("extracting: " + hdr.Name)
            w, err := os.Create(hdr.Name)
            if err != nil {
                log.Fatal(err)
            }
            _, err = io.Copy(w, tr)
            if err != nil {
                log.Fatal(err)
            }
            w.Close()
        }
    }
    f.Close()
}

答案 2 :(得分:1)

Go标准库中没有Lempel-Ziv-Markow编码器或解码器。如果允许您假设运行代码的平台提供xz实用程序,则可以使用这样的存根函数:

import "os/exec"

// decompress xz compressed data stream r.
func UnxzReader(r io.Reader) (io.ReadCloser, error) {
    unxz := exec.Command("xz", "-d")
    unxz.Stdin = r
    out, err := unxz.StdoutPipe()
    if err != nil {
        return nil, err
    }

    err = unxz.Start()
    if err != nil {
        return nil, err
    }

    // we are not interested in the exit status, but we should really collect
    // that zombie process
    go unxz.Wait()

    return out, nil
}