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の使い方については、下記の記事も参考にしてください。
RubyのDirクラスの使い方とは?例を使い詳しく解説します

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メソッドのいずれかを使ってください。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。