2017-03-02 4 views
-1

一時的なgzipファイルを作成してファイルに書き込もうとしています。問題は、私がReadAllで何が起こっているのか理解していないことです。私は、ReadAllがファイルに書き込まれたバイトを返すと期待していましたが、何もありません。しかし、File.Statコマンドは実際にデータがあることを示しています。ここで ファイルからのReadAllが期待通りに動作しない

filename := "test" 
file, err := ioutil.TempFile("", filename) 
if err != nil { 
    fmt.Println(err) 
} 
defer func() { 
    if err := os.Remove(file.Name()); err != nil { 
     fmt.Println(err) 
    } 
}() 

w := gzip.NewWriter(file) 
_, err = w.Write([]byte("hell0")) 
if err != nil { 
    fmt.Println(err) 
} 

fileInfo, err := file.Stat() 
if err != nil { 
    fmt.Println(err) 
} 
fileBytes, err := ioutil.ReadAll(file) 
if err != nil { 
    fmt.Println(err) 
} 
if err := w.Close(); err != nil { 
    fmt.Println(err) 
} 
fmt.Println("SIZE1:", fileInfo.Size()) 
fmt.Println("SIZE2:", len(fileBytes)) 

は遊び場リンク https://play.golang.org/p/zX8TSCAbRL

なぜノー返されたバイトがあるのですか? 返されるバイトを取得するにはどうすればよいですか?

答えて

3

を確認し、それを読む前にファイルを閉じます。 GZIPのthe documentationから

書き込みは、基礎となるio.WriterにPの圧縮形式を書き込みます。圧縮されたバイトは、Writerが閉じるまで必ずフラッシュされるとは限りません。

したがって、解決策は、バイト数を読み取ろうとする前に、gzip Writerと基礎となるio.Writerの両方になります。

func main() { 
     basename := "test" 
     file, err := ioutil.TempFile("", basename) 
     tempFilename := file.Name() 
     if err != nil { 
      fmt.Println(err) 
     } 
     defer func() { 
      if err := os.Remove(file.Name()); err != nil { 
       fmt.Println(err) 
      } 
     }() 

     w := gzip.NewWriter(file) 
     _, err = w.Write([]byte("hell0")) 
     if err != nil { 
      fmt.Println(err) 
     } 

     w.Close() 
     file.Close() 

     file, err = os.Open(tempFilename) 
     fileInfo, err := file.Stat() 
     if err != nil { 
      fmt.Println(err) 
     } 
     fileBytes, err := ioutil.ReadAll(file) 
     if err != nil { 
      fmt.Println(err) 
     } 
     if err := w.Close(); err != nil { 
      fmt.Println(err) 
     } 
     fmt.Println("SIZE1:", fileInfo.Size()) 
     fmt.Println("SIZE2:", len(fileBytes)) 

} 

閲覧Playgroundである。

1

ヨは、ファイルの先頭をseekする必要があります。

_, _ = file.Seek(0, 0) 
fileBytes, err := ioutil.ReadAll(file) 
if err != nil { 
    fmt.Println(err) 
} 

Playground

関連する問題