2017-03-02 27 views
-2

私はtarファイルの中でファイルをループすることができましたが、それらのファイルの内容を文字列として読み取る方法に固執しています。私は文字列としてファイルの内容を印刷する方法を知りたいですか?解凍せずにgolangでtarファイルの内容を読む

これはちょうどあなたが読みたいファイルごとにio.Readerとしてtar.Readerを使用

package main 

import (
    "archive/tar" 
    "fmt" 
    "io" 
    "log" 
    "os" 
    "bytes" 
    "compress/gzip" 
) 

func main() { 

    file, err := os.Open("testtar.tar.gz") 

    archive, err := gzip.NewReader(file) 

    if err != nil { 
     fmt.Println("There is a problem with os.Open") 
    } 
    tr := tar.NewReader(archive) 

    for { 
     hdr, err := tr.Next() 
     if err == io.EOF { 
      break 
     } 
     if err != nil { 
      log.Fatal(err) 
     } 

     fmt.Printf("Contents of %s:\n", hdr.Name) 
    } 

} 

答えて

5

以下の私のコードです。

tr := tar.NewReader(r) 

// get the next file entry 
h, _ := tr.Next() 

あなたは文字列としてファイル全体が必要な場合:あなたが行ずつを読み取る必要がある場合、これは良いだろう

// read the complete content of the file h.Name into the bs []byte 
bs, _ := ioutil.ReadAll(tr) 

// convert the []byte to a string 
s := string(bs) 

を:

// create a Scanner for reading line by line 
s := bufio.NewScanner(tr) 

// line reading loop 
for s.Scan() { 

    // read the current last read line of text 
    l := s.Text() 

    // ...and do something with l 

} 

// you should check for error at this point 
if s.Err() != nil { 
    // handle it 
} 
+0

これは正しいタイプのコンテンツを読み取りますが、すべてがuint8タイプのスライスだけです。実際のコンテンツはありません。 –

+0

あなたは、リーダーがそのタイプを知ることは期待できません。そのコンテンツを処理するのはあなたの責任です。 – AJPennster

+0

@AJPennsterあなたは簡単な変換方法を知っていますか?スライス要素が文字列の行を返さない方法として混乱していますが、intです。私は変換について行く方法はありません。 –

0

からいくつかの助けを借りて公式サイトこれは私が以前に意図したものです。特別なフォーカスは、バイトから文字列への変換が行われる最下部に向ける必要があります。

package main 

import (
    "archive/tar" 
    "fmt" 
    "io" 
    "log" 
    "os" 
    "bytes" 
    "compress/gzip" 
) 

func main() { 

    file, err := os.Open("testtar.tar.gz") 

    archive, err := gzip.NewReader(file) 

    if err != nil { 
     fmt.Println("There is a problem with os.Open") 
    } 
    tr := tar.NewReader(archive) 

    for { 
     hdr, err := tr.Next() 
     if err == io.EOF { 
      break 
     } 
     if err != nil { 
      log.Fatal(err) 
     } 

     fmt.Printf("Contents of %s:\n", hdr.Name) 

     //Using a bytes buffer is an important part to print the values as a string 

     bud := new(bytes.Buffer) 
     bud.ReadFrom(tr) 
     s := bud.String() 
     fmt.Println(s) 
     fmt.Println() 
    } 

} 
+0

文字列全体を読む簡単な方法については、私の答えをチェックしてください –

関連する問題