0
Help us understand the problem. What are the problem?

posted at

GoでZIPファイル扱う

はじめに

PHPerだった私にはGoのZIPファイルの取り扱い方が少々ややこしかったので、忘れたときのために覚書を残すことにした。

ZIPファイルの読み方

基本的な手順はこちら。

  1. ZIPファイルを開く
  2. 個別のファイルエントリーを取得
  3. ファイルエントリーの情報が欲しい場合はFileHeader要素から取得
  4. ファイルエントリーの中身を見たい場合はオープン
reader.go
package main

import (
  "archive/zip"
  "io"
)

// エラー処理は省略
func main() {
  zipfile, _ := zip.OpenReader("./sample.zip") // 1. ZIPファイルを開く
  defer zipfile.Close()
  for _, entry := range zipfile.File { // 2. 個別のファイルエントリーを取得
    println(entry.FileHeader.Name) // 3. ファイルエントリーの情報が欲しい場合はFileHeader要素から取得
    reader, _ := entry.Open() // 4. ファイルエントリーの中身を見たい場合はオープン
    content, _ := io.ReadAll(reader)
    println(string(content))
    defer reader.Close()
  }
}

ZIPファイルの書き方

基本的な手順はこちら。

  1. ファイルを生成
  2. ZIPのライターにする
  3. ヘッダーを作成
  4. ヘッダーからライターを生成
  5. 書き込み
writer.go
package main

import (
  "archive/zip"
  "os"
  "time"
  "fmt"
)

func main() {
  f, _ := os.Create("./writer_sample.zip") // 1. ファイルを生成
  writer := zip.NewWriter(f) // 2. ZIPのライターにする
  defer writer.Close()

  fh := new(zip.FileHeader) // 3. ヘッダーを作成
  fh.Name = "./file_entry1.txt"
  fh.Method = zip.Deflate
  fh.Modified = time.Now()
  w, _ := writer.CreateHeader(fh) // 4. ヘッダーからライターを生成
  w.Write([]byte("I'm FileEntry1")) // 5. 書き込み

  w, _ = writer.Create("./entries/file_entry2.txt") // ヘッダーを作らなくてもよいが、名前以外はデフォルト値になる
  w.Write([]byte("I'm FileEntry2")) // 5. 書き込み
} 

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?