【Ruby入門】zipファイルの圧縮・解凍・パスワードの指定

こんにちは!システムエンジニアのオオイシです。

Rubyでzipファイルの圧縮や解凍方法を知っていますか?

rubyzipというライブラリを使えばRubyでzipファイルの作成や解凍が可能です。

この記事では、

  • rubyzipをインストール
  • ファイルをzip圧縮する
  • zipファイルを解凍する
  • パスワード付きzipファイルの作成する
  • パスワード付きzipファイルの解凍する

といった基本的な内容から、

  • ディレクトリを圧縮する
  • 解凍せずにzipファイルを読み取る
  • Rubyの文字列からzipファイルを作成する

などの応用的な使い方に関しても解説していきます!

今回はこれらの方法を覚えるために、Rubyでzipファイルを扱うためのさまざまな使い方をわかりやすく解説します!

rubyzipの使い方

rubyzipをインストールする

Rubyでzipファイルへの圧縮や解凍をするにはいくつかの手段がありますが、「rubyzip」というライブラリを使う方法が一般的なので、この方法について解説します。

まずはじめにrubyzipのgemをインストールしましょう。

実行結果:

gemとは、Rubyのパッケージ管理システムです。

gemを知らない場合は、こちらで詳しく説明していますので参考にしてください。

では、次の項でさっそくzipファイルを扱ってみましょう!

ファイルをzip圧縮する

rubyzipには、zipファイルに圧縮するために使用する「Zip::OutputStream」クラスがあります。

「Zip::OutputStream」クラスの使い方のイメージは、zipファイルへ小川(Stream)が流れるように書き込みを行います。

ここでは、基本的な使い方を知っていただくために、1つのファイルをzip圧縮する方法をサンプルコードを交えて解説します。

サンプルプログラムで使うファイル構造は次のとおりです。

たくさんのファイルがありますが、丁寧に説明するのでご安心ください!

それぞれファイルの役割は次のようになります。

ファイル名説明
compress.rbzipファイルを作成するサンプルプログラム
input/file_name.txt圧縮元のテキストファイル
zip_file.zipプログラム実行後に作成されるzipファイル
output/file_name.txtzip_file.zipの中に圧縮されたファイル

まずは、プログラムを実行する前準備として、圧縮元のテキストファイル(input/file_name.txt)を作成してください。

テキストファイルの内容は任意ですが、今回は次のようにしました。

それでは、”input/file_name.txt”の1つのファイルを”zip_file.zip”ファイルへ圧縮するサンプルプログラムを確認してみましょう。

実行してみましょう。

実行した結果、”zip_file.zip“が作成されます。

このサンプルプログラムでは、

  • out.put_next_entry(zipへ書き込むファイルのパス)
  • out.write(zipへ書き込む内容)

で、2つのメソッドを使ってzipファイルへ書き込みができる点について解説しました。

「Zip::OutputStream」クラスのメソッドは次のようなものがあります。

メソッド名用途・目的
open圧縮するzipファイルのパスを引数に指定。
ブロックには「Zip::OutputStream」のインスタンス変数が渡る
put_next_entryzipファイルに登録するファイルパスを引数に指定
writeput_next_entryに指定したファイルパスに書き出す文字列を引数に指定

以降の説明は、この解説の応用になるので簡単にわかっていただけると思います!

また、サンプルプログラムの中で登場したFileクラスについては、こちらで詳しく説明していますのでぜひ参考にしてください。

【Ruby入門】ファイルの読み込みと書き込みまとめ(File open)
更新日 : 2019年8月2日

zipファイルを解凍する

rubyzipでは、zipファイルを解凍するために「Zip::InputStream」クラスを使います。

「Zip::InputStream」クラスの使い方のイメージは、小川(Stream)が流れるようにzipファイルを読み込みます。

それでは、前項のプログラムで作成した”zip_file.zip”ファイルを解凍するサンプルプログラムについて解説していきます。

今回のファイル構造は次のようにしました。

それぞれファイルの役割は次のようになります。

ファイル名説明
uncompress.rbzip_file.zipを解凍するサンプルプログラム
zip_file.zip前項のサンプルプログラムで作成したzipファイル
output/file_name.txtzip_file.zipの中のテキストファイル

それでは、サンプルプログラムを確認してみましょう。

実行してみましょう。

実行した結果、”1行目<改行>2行目“という内容テキストファイルが”output/file_name.txt”に作成されました。

このサンプルプログラムでは、

  • input.get_next_entry → zip内で取得可能なファイルの情報を取得
  • input.read → ファイルの読み出し

の2つのメソッドを使ってzipファイルを解凍できることを解説しました。

「Zip::InputStream」クラスの代表的なメソッドは次のとおりです。

メソッド名用途・目的
open解凍するzipファイルのパスを第1引数に指定
get_next_entryzipファイル内のファイル情報を返す
readzipファイル内のデータを読み取り返す

また、サンプルプログラムの中で登場したDirクラスについては、こちらで詳しく説明していますので、ぜひ参考にしてください。

【完全網羅】Rubyのディレクトリ・ファイル操作まとめ(dir, file)
更新日 : 2018年12月28日

パスワード付きzipファイルを取り扱うには

パスワード付きzipファイルの作成

rubyzipではパスワード付きのzipファイルを作成することができます。

セキュリティー上の理由からzipファイルにパスワードを付与することは、いまや常識となっているので、ここで覚えておくと何かと役に立ちます!

そんなパスワードつきのzipファイルの作成も、これまでの解説の応用なので作成はとってもカンタンです!

このプログラムを実行した結果、パスワード付きの”password_zip_file.zip“ファイルが作成されます。

次は、Rubyプログラムでパスワードつきのzipファイルを解凍する解説をします。

パスワード付きzipファイルの解凍

rubyzipではパスワード付きのzipファイルを解凍することができます。

前項で作成した、パスワード付きzipファイルの”password_zip_file.zip”を解凍するサンプルプログラムを確認してみましょう。

実行した結果、パスワード付きzipが解凍されて”output/file_name.txt”にファイルが出来上がります。

このように「Zip::InputStream.open」メソッドの第3引数にパスワードを指定するだけでパスワード付きzipファイルを、カンタンに解凍するできることが理解いただけたと思います!

また、サンプルプログラム中のDir.mkdirメソッドについてはこちらで詳しく説明していますので、ぜひ参考にしてください。

ディレクトリを圧縮する

ディレクトリ内の全てのファイルを含んだzipファイルを作成する方法を確認してみましょう。

今までの解説で登場した「Zip::OutputStream」クラスを使った応用ですので、新しいことを覚えずに実現できます。

このサンプルプログラムでは”input_dir”フォルダ内の全てのファイルを”input_dir.zip”ファイルへ圧縮する例です。

プログラムを実行する前には”input_dir”フォルダへ圧縮したい任意のファイルをコピーするなどして準備しておいてください。

実行した結果、”input_dir.zip“が作成されるので、ソフトで解凍してファイルの内容を確認してみてください。

解凍せずにzipファイルを読み取る方法

rubyzipでは、zipファイルを解凍せずにzip内のファイルを読み込むことが可能です。

zip内のテキストファイルを読み取るには、1行ごとに文字列を取得するために使用するeach_lineメソッドを使うと便利です。

前章のサンプルで作成した”zip_file.zip“内のテキストファイルを読み取るサンプルプログラムを確認してみましょう。

実行結果:

このように、”zip_file.zip“ファイル内の”output/file_name.txt”の内容を読み取って、putsメソッドで出力することができました。

each_lineメソッドを使うと、zip内のテキストファイルを改行毎に処理できることがわかっていただけたと思います!

each_lineメソッド以外にも、Rubyプログラムで使える次のような便利なメソッドがあるので、ぜひ使ってみてください!

メソッド名用途・目的
each_lineファイル内の文字列を行毎に読み取り、ブロックの変数に渡す
readlinesファイル内の文字列を行毎に読み取り、配列で返す
read画像や文字列などのバイナリデータを読み取る

文字列からzipファイルを作成する

rubyzipではRubyプログラムからzipファイルへ直接書き込むことができます。

今まで解説したサンプルプログラムの応用なのでカンタンに実現することできます。

zipファイルに2つのテキストファイルを作成し、文字列を書き込むサンプルプログラムを確認してみましょう。

実行した結果、”zip_file.zip“ファイルが作成できるので、ソフトで解凍すると、次のようなファイルが作成されています。

output/file_name1.txt:

output/file_name2.txt:

このように、Rubyプログラム内からzipファイルを作成できることができました。

その他にもzip内のファイルへ書き出すために、次のような便利なメソッドがあります。

メソッド名説明
print引数に指定した文字列または配列をzip内のファイルに出力
putsprintメソッドと同様。違いは改行コードを行末に自動挿入
printf第1引数に指定した書式で、2引数の文字列をzip内のファイルに出力
putc引数に指定した1文字または1桁の整数をzip内のファイルに出力
write引数に指定した文字列や画像などのバイナリデータをzip内のファイルに出力

また、printfメソッドの書式についてはこちらで詳しく説明していますので、ぜひ参考にしてください。

まとめ

いかかでしたか?

今回はrubyzipを使ったzipファイルへの圧縮や解凍方法の使い方について説明しました。

rubyzipを使うとパスワード付きのzipファイルの作成や解凍を処理することが可能です。

rubyzipを使うとプログラム内からzipファイルの読み取りや書き込みしたい場合に大変便利になので、ぜひ活用してください。

そして、rubyzipの使い方を忘れてしまったらこの記事を確認してくださいね!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

オオイシ

オオイシ

システムエンジニア歴15年のオオイシです!好物は Java と Ruby。プログラミング、システムアーキテクトからマネジメントに到るまでなんでも食べます。
システム開発の相談やお困りごとがあればお気軽に
[email protected] まで連絡頂けると幸いです

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説