見出し画像

golang 7zipを使って圧縮、解凍を行う方法

今回はgolangの7zipについて解説していきます。


Go言語で7zipを使う

Goの標準ライブラリには7zip形式をサポートする機能は含まれていないため、外部ライブラリを利用するのが一般的です。


外部7zipプログラムの呼び出し

まずos/execパッケージを使用してシステムの7zipプログラムを直接呼び出すことができます。
この方法は7zipがシステムにインストールされていることが前提になります。

import (
    "os/exec"
)

func main() {
    cmd := exec.Command("7z", "a", "output.7z", "input.txt")
    err := cmd.Run()
    if err != nil {
        ~~~~~~~
    }
}

exec.Command関数では、外部コマンドを実行するための*exec.Cmd構造体を生成しているため、7zコマンドを引数として使用しています。
"a"は新しいアーカイブを作成するための7zipのオプションで、"output.7z"は出力されるアーカイブファイルの名前、"input.txt"は圧縮するファイルを指定しています。

cmd.Run()メソッドはコマンドを実行し、そのプロセスが終了するまで待ちます。プロセスがエラーなく正常に終了した場合、Runはnilを返します。

7zがインストールされていない環境で実行すると、exec.Commandはエラーを返します。


go-unarrライブラリを使う

go-unarrライブラリを使用することで、Goのアプリケーション内で直接7zipファイルを操作できるようになります。

まずはgo-unarrライブラリをgo getします。

go get github.com/gen2brain/go-unarr

getしたgo-unarrライブラリをインポートして以下のようなコードを実装します。

import (
    "github.com/gen2brain/go-unarr"
)

func main() {
    a, err := unarr.NewArchive("archive.7z")
    if err != nil {
       ~~~~~~~~~~~
    }
    defer a.Close()

    _, err = a.Extract("destination")
    if err != nil {
       ~~~~~~~~
    }
}

unarr.NewArchive("archive.7z")は、指定された7zファイルから新しいアーカイブオブジェクトを作成します。

a.Extract("destination")は、アーカイブの内容を指定されたディレクトリに解凍します。Extractでは解凍されたファイルの数とエラー情報を返します。

go-unarrライブラリでは7zip以外にもRAR、ZIP、TARも同様の操作を行うことができます。


golangをもっと詳しくなりたい方に

初めてのGo言語

Go言語の入門から応用まではこの一冊で網羅されています。説明も順序立てて説明されており完成度の高い参考書となっています。


詳解Go言語Webアプリケーション開発

こちらはGo言語の基礎知識を得たあとに読むことをすすめる本となっています。ハンズオン形式で手を動かしながら実装をしていくことができるため、実際の開発を意識しながらGo言語を学ぶことができます。

以下の記事では他にも筆者が実際に読んでおすすめしたい本をまとめています。


【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)

まだGo言語の勉強を始めていない方、全くの初心者の方にはこちらのUdemy教材が最もおすすめです。

この教材ではgolangの基礎について網羅的に学ぶことができます。ただ見て学ぶだけでなく、講座の中でアプリ作成まで行うことで学んだことの理解をさらに深めることができます。


現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発

個人的に最も勉強になったのは「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」という教材です。
本格的なレクチャーに入る前に、なぜGoなのか、なぜFintechなのかについて説明されていることで、Goの概念や意味について大枠から理解することができます。

以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。

※本ページではアフィリエイトリンク(PR)が含まれています


この記事が参加している募集

#この経験に学べ

55,106件

この記事が気に入ったらサポートをしてみませんか?