いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-214 (archive/zip を使ったZipファイル生成サンプル)

概要

たまーに使うことがあるので、忘れないうちにメモメモ。

/*
   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

過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。