2015-01-31 3 views

답변

2

나는 최근 XZ decompression package 그래서 tar.xz를 추출 지금 수 있습니다 생성 Go 코드 만 사용하십시오.

다음 코드는 현재 디렉토리에 파일 myfile.tar.xz를 추출 :

package main 

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

    "xi2.org/x/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() 
} 
3

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

또한 당신은 이동 표준 라이브러리에는 렘펠 - 지브 - Markow 인코더 또는 디코더가 없습니다

import "os/exec" 

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

이 실제로 타르를 통해 압축되지 않습니다. 당신은 아마도 tar xvJf archive.tar.xz를 원할 것입니다. – Fire

+0

@Fire GNU tar는 압축의 존재를 자동으로 감지하기 때문에 GNU tar를 사용합니다. 이 프로그램이'J'를 제공하지 않는 다른 tar 구현과 호환되도록하려면'xz -d'와'tar x' 사이에 파이프를 설정해야 할 수도 있습니다. 또한, 왜'v'를 제공합니까? 필수는 아닙니다. – fuz

+1

사실입니다. 'v'는 필요하지 않습니다. – Fire

1

할 수 있습니다. 당신은 당신의 코드가 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 
} 
+0

반환 할 인수가 충분하지 않습니다. – Fire

+0

r을 사용하고 있지 않습니다. – Fire

+0

@Fire 죄송합니다. 필자는이 편지를 작성할 때 피곤했습니다. 모든 버그는 지금 수정되었습니다. – fuz

관련 문제