0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GoでZIPファイル扱う

Posted at

はじめに

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. 書き込み
} 
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?