Go言語でZIPファイルを解凍する方法
最近、サーバサイドのプログラムをGo言語で運用するようになりました。
Go言語でZIPファイルを解凍する必要があり、思いの外、苦戦しました(・_・;
他にも苦労している人がたくさんいるような気がします。
そのため、私の備忘録の意味も込めて、Go言語を用いたZIPファイル解凍のサンプルコードをアップしようと思います。
目次
スポンサーリンク
プログラムについて
ソースコード
以下がソースコードです。
// ZIPファイルを解凍するプログラム package main import ( "archive/zip" "io" "io/ioutil" "log" "os" "path/filepath" ) func Unzip(src, dest string) error { r, err := zip.OpenReader(src) if err != nil { return err } defer r.Close() for _, f := range r.File { rc, err := f.Open() if err != nil { return err } defer rc.Close() if f.FileInfo().IsDir() { path := filepath.Join(dest, f.Name) os.MkdirAll(path, f.Mode()) } else { buf := make([]byte, f.UncompressedSize) _, err = io.ReadFull(rc, buf) if err != nil { return err } path := filepath.Join(dest, f.Name) err := ioutil.WriteFile(path, buf, f.Mode()) if err != nil { return err } } } return nil } func main() { err := Unzip("./sample.zip", "./") if err != nil { log.Fatal(err) } }
使い方
Unzip関数の第一引数に解凍したいZIPファイル、第二引数に出力先のディレクトリを渡すだけです。
プログラムの解説
簡単にプログラムの解説も書いておきます。
ZIPファイルの中身を取得
まず、zip.OpenReader関数でZIPファイルの中身を取得します。
この関数は、ZIPファイルの中身を配列で返してきます。
ZIPファイルの中身を1つずつ処理
次に、ZIPファイルの中身を1つずつ処理します。
具体的には
for _, f := range r.File { // 処理する内容 }
のようにして1つずつ処理します。
そして、fがフォーカスしているのがディレクトリであればディレクトリを作成し、ファイルであればファイルを作成します。
// フォーカスしているのがディレクトリのとき if f.FileInfo().IsDir() { // 略 // フォーカスしているのがファイルのとき } else { // 略 }
ファイルの作成方法は、bufというメモリ(スライス)にコピー元のファイルを書き込んで、出力先にファイルを作成して新たに書き込むだけです。
まとめ
以上です。
何か質問がありましたら、気軽にコメントをお願いします_φ( ̄ー ̄ )
スポンサーリンク
関連記事