RubyにはOSに直接アクセスする機能が組み込まれているので、ファイルの一覧を作ることが可能です。そのためRuby on RailsによるWebアプリケーションでファイル一覧を作ったり、サーバー管理のスクリプトなどにも利用できます。
そしてRubyでファイル一覧リストを作るのプログラム作成に利用するライブラリがDirクラスです。今回はRubyのDirクラスのメソッドを利用し、ファイルの一覧リストを作る方法について紹介します。
Rubyでファイル一覧を得るには
Ruby on Railsで作ったWebアプリケーション内で管理しているファイルの一覧を作ることになったらどうすればいいでしょうか。RubyにはOSにアクセスする機能があり、ファイルやディクレトリにアクセスできます。
そしてファイル一覧を取得する処理に利用するライブラリは、ディレクトリを扱うDirクラスです。次からDirクラスの基本について紹介します。
Dirクラスとは
Dirクラスは、Rubyをインストールした際にいっしょにインストールされる、ディレクトリを操作するための組み込みライブラリです。そして標準ライブラリのため、requireによるライブラリの読み込みは必要ありません。
なお、Dirクラスはディレクトリ用のクラスです。ファイル一覧を取得するには、そのディレクトリの情報として取得します。なお、ディレクトリに含まれるファイルにアクセスするにはFileクラスなど別のクラスを利用してください。
Dirクラスのentriesメソッド
Dirクラスにはディレクトリの作成、変更、削除や、ディレクトリの検査などを担当するメソッドが定義されています。そして、ディレクトリの一覧を取得するのが、entriesメソッドです。
なおディレクトリを扱う際には、パス名を指定しなければなりません。そしてディレクトリとはファイルを階層構造で管理するための仕組みで、macOSやWindowsではフォルダとも呼ばれます。このパスを指定する方法として、最も上の階層から順に書く絶対パスと、今の階層からの相対的な位置を書く相対パスとがあります。
Dirクラスを使いこなすなら、パスの書き方も合わせて習得してください。
絶対パスの例: /var/www/html/rails/app/
相対パスの例: ../../app/
Dirクラスの他のメソッドでも可能
Dirクラスに定義されているファイル一覧を取得できるメソッドはentriesだけではありません。同じDirクラスのforeachメソッドとglobメソッドは、使い方次第でファイル一覧を取得できます。それらもうまく活用してください。
・foreachメソッド
指定したパス名のディレクトリに含まれるファイルを対象にブロックを評価するメソッド。ブロック内でファイル一覧を作成できる。
・globメソッド
「*」や「?」といったワイルドカードを展開し、パターンにマッチするファイル名を文字列の配列として返すメソッド。「*」を指定すれば、ファイルの一覧を取得できる。
entriesによるファイル一覧の取得
次からRubyのDirクラスに定義されたentriesメソッドを利用したファイルの一覧を取得する方法について解説します。
entriesメソッドの文法
entriesメソッドは、引数に指定されたパスに含まれるファイルの一覧を返すメソッドです。ファイルが1つの場合はファイル名を文字列として、またファイルが複数ある場合に配列として返します。
Dirクラスのentriesメソッドの文法
entries( パス名 )
もしファイルの一覧を取得できずにエラーが発生した場合、begin~rescueによるRubyの例外処理で、そのエラーを受け取ることが可能です。
また、2つ目の引数にディレクトリのエンコーディングを指定できます。なお省略した場合はファイルシステムのエンコーディングが使われるので、省略しても問題ありません。またファイル名やディレクトリ名が日本語の全角文字が使われていてもentriesメソッドを利用しても文字化けしません。
entriesメソッドの使用例
次に一覧を取得したいディレクトリパスを変数に格納し、Dirクラスのentriesメソッドを使ってファイル一覧を取得する例を紹介します。
path = "/var/www/html/" begin files = Dir.entries(path) rescue puts "ファイル一覧の取得に失敗しました" end p files
この例は、変数pathに格納された”/var/www/html/”のファイル一覧を、Dirクラスのentriesメソッドで取得し、filesに格納しています。ファイルが複数ある場合は、filesにはそれらを格納した配列として参照できます。
foreachによるファイル一覧の取得
Dirクラスのforeachメソッドは、指定したパス名に含まれるファイルの全てを配列のeachメソッドのようにブロックで評価するメソッドです。Rubyのブロック記法が使えるので、より柔軟な書き方が可能です。
次にforeachメソッドによるファイル一覧を取得する方法を紹介します。
foreachメソッドの文法
Dirクラスのforeachメソッドの文法は次のとおりです。
Dir.foreach( パス名 ) { | ブロック変数 |
ブロック変数を使った処理
}
なお、2つ目の引数としてディレクトリのエンコーディングを指定できます。ただし省略してもファイルシステムのエンコーディングが使われるので、Rubyが日本語に対応していれば日本語のファイル名やデフィレクトリ名も処理できます。
そしてforeachメソッドの戻り値はありませんが、ファイル名の取得に失敗した場合に処理を中断させないために、begin~rescueによる例外処理に組み込むと良いでしょう。
foreachメソッドの使用例
次に一覧を取得したいディレクトリパスを変数に格納し、Dirクラスのforeachメソッドを使ってファイル一覧を取得する例を紹介します。
path = "/var/www/html/" arr = [] begin Dir.foreach(path) do |item| if /^(?!\.)/ =~ item then arr.push(item) end end rescue puts "ファイル一覧の取得に失敗しました" end p arr
この例は、先ほど紹介したentriesメソッドの例と同じように変数pathに格納されたディレクトリの下のファイル一覧をDirクラスのforeachメソッドで取得し、ブロックを作って配列arrに格納しています。さらにブロック内に「.」を含むファイルやデフィクレトリを含まない、という正規表現を使って制限しています。
globによるファイル一覧の取得
Dirクラスのglobメソッドは、先ほど紹介したようにパターンにマッチするファイル名を文字列の配列として返すメソッドです。そのためファイル一覧を取得する場合、entriesメソッドやforeachメソッドと違い、ファイル名を検索するためのパターンを指定します。
次からglobメソッドの使い方について紹介します。
globメソッドの文法
Dirクラスのglobメソッドは、引数にファイルを検索するパターンを指定し、一致したファイル名を配列で返します。引数に検索するパターンの文字列を指定してください。
Dir.glob( パターン )
また、このメソッドでブロックを指定し、取得したファイル名をその中で評価するRubyらしい書き方も可能です。
Dir.glob( パターン ) { | ブロック変数 |
ブロック変数を使った処理
}
そしてパターンのみ指定しても使えますが、2番目以降のオプションを指定することで、マッチング処理を制御することも可能です。なお、globメソッドで指定するパターンには、シェルなどでファイル名を扱う際に使えるワイルドカードが使えます。正規表現は使えないので注意してください。
ワイルドカードの例
* 空文字列を含む任意の文字列と一致
? 任意の一文字と一致
[] 鈎括弧内のいずれかの文字と一致
{} コンマで区切られた文字列の組合せに展開する
globメソッドの使用例
次に一覧を取得したいディレクトリパスを変数に格納し、Dirクラスのglobメソッドを使ってファイル一覧を取得する例を紹介します。
path = "/var/www/html/" arr = [] begin Dir.chdir(path) Dir.glob("*") do |item| arr.push(item) end rescue puts "ファイル一覧の取得に失敗しました" end p arr
これは先ほど紹介したDirクラスのforeachメソッドの例と同じ結果を得るために、Dirクラスのglobクラスを使った例です。先にchdirメソッドでカレントパスを変更し、そのディレクトリに対してDirクラスのglobメソッドのブロックで、ファイル一覧を配列にしています。
まとめ
これまで紹介したようにRubyのプログラムでファイル一覧を取得するにはDirクラスのメソッドを利用します。そしてDirクラスでファイルを取得するのには今回例で紹介したように、entriesメソッド、foreachメソッド、globメソッドのいずれかを使ってください。
Dirの使い方については、下記の記事も参考にしてください。
RubyのDirクラスの使い方とは?例を使い詳しく解説します