はじめに
PHPerだった私にはGoのZIPファイルの取り扱い方が少々ややこしかったので、忘れたときのために覚書を残すことにした。
ZIPファイルの読み方
基本的な手順はこちら。
- ZIPファイルを開く
- 個別のファイルエントリーを取得
- ファイルエントリーの情報が欲しい場合はFileHeader要素から取得
- ファイルエントリーの中身を見たい場合はオープン
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ファイルの書き方
基本的な手順はこちら。
- ファイルを生成
- ZIPのライターにする
- ヘッダーを作成
- ヘッダーからライターを生成
- 書き込み
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. 書き込み
}