2013-10-24 3 views
3

Как я могу читать xz файлов в программе go? Когда я пытаюсь прочитать их, используя lzma, я получаю ошибку error in lzma header.Чтение xz файлов в go

+0

Я предполагаю, что эта библиотека поддерживает только LZMA и не LZMA2, который используется 'xz' архивов , – nemo

ответ

8

У вас есть 3 варианта.

  1. Попробуйте использовать другую библиотеку, возможно, использующую cgo. Я вижу два here.
  2. Используйте cgo напрямую/создайте собственную библиотеку.
  3. Используйте исполняемый файл xz.

Вариант третий легче, чем кажется. Вот что я хотел бы использовать:

func xzReader(r io.Reader) io.ReadCloser { 
    rpipe, wpipe := io.Pipe() 

    cmd := exec.Command("xz", "--decompress", "--stdout") 
    cmd.Stdin = r 
    cmd.Stdout = wpipe 

    go func() { 
     err := cmd.Run() 
     wpipe.CloseWithError(err) 
    }() 

    return rpipe 
} 

Runnable код здесь: http://play.golang.org/p/SrgZiKdv9a

+0

Спасибо, я как-то пропустил и godoc.org, и этот удивительно простой трубопровод. – phihag

+1

Ваше решение Option 3 обычно полезно для широкого диапазона команд оболочки, которые должны быть включены в программы Go. –

2

Я недавно создал пакет декомпрессионной XZ. Это не требует Cgo. Вы можете найти его здесь:

https://xi2.org/x/xz

Программа для распаковки стандартного ввода на стандартный вывод:

package main 

import (
    "io" 
    "log" 
    "os" 

    "xi2.org/x/xz" 
) 

func main() { 
    r, err := xz.NewReader(os.Stdin, 0) 
    if err != nil { 
     log.Fatal(err) 
    } 
    _, err = io.Copy(os.Stdout, r) 
    if err != nil { 
     log.Fatal(err) 
    } 
} 
Смежные вопросы