概要
たまーに使うことがあるので、忘れないうちにメモメモ。
/* archive/zip の サンプルです。 REFERENCES: - https://pkg.go.dev/archive/zip@latest */ package main import ( "archive/zip" "bufio" "os" "time" ) func _err(err error) { if err != nil { panic(err) } } func main() { // zip.Writer を 取得 zw := zip.NewWriter(os.Stdout) // zipファイル内にファイルを追加 w, err := zw.Create("test.txt") _err(err) bw := bufio.NewWriter(w) bw.WriteString("hello world") _err(bw.Flush()) // zipファイル内にディレクトリ付きでファイルを追加 w, err = zw.Create("dir1/test2.txt") _err(err) bw = bufio.NewWriter(w) bw.WriteString("world hello") _err(bw.Flush()) // zip.FileHeaderを用いてファイルを追加 fh := zip.FileHeader{ Name: "dir1/test3.txt", Comment: "this is test3.txt comment", Modified: time.Now().Truncate(24 * time.Hour), } w, err = zw.CreateHeader(&fh) _err(err) bw = bufio.NewWriter(w) bw.WriteString("HELLO WORLD") _err(bw.Flush()) // zipファイルにコメントを設定 err = zw.SetComment("this is test zip file") _err(err) // 最後に Close() を呼んでおかないとZipファイルが生成できないので注意 _err(zw.Flush()) _err(zw.Close()) }
試すための Taskfile.yml (go-task用のファイル) は以下。
version: '3' tasks: default: cmds: - task: run - task: confirm run: cmds: - go run main.go > test.zip confirm: cmds: - file test.zip - unzip -l test.zip - unzip -z test.zip extract: cmds: - unzip -d tmp test.zip clean: cmds: - rm test.zip - rm -rf tmp
実行すると以下のようになります。
gitpod /workspace/try-golang (master) $ task -d examples/singleapp/zipfilewrite/ task: [run] go run main.go > test.zip task: [confirm] file test.zip test.zip: Zip archive data, at least v2.0 to extract task: [confirm] unzip -l test.zip Archive: test.zip this is test zip file Length Date Time Name --------- ---------- ----- ---- 11 1980-00-00 00:00 test.txt 11 1980-00-00 00:00 dir1/test2.txt 11 2022-06-20 00:00 dir1/test3.txt this is test3.txt comment --------- ------- 33 3 files task: [confirm] unzip -z test.zip Archive: test.zip this is test zip file
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。