Rubyにはディレクトリを操作したり検索したりするDirクラスが標準で組み込まれています。そしてこれは、Webシステムで画像などのファイルを扱ったり、Rubyでサーバーの設定を自動化するプログラムなどで使える機能です。
今回はDirクラスで利用できるメソッドの使い方について、例を使い詳しく解説します。
Dirクラスで使える機能とは
Rubyには、ファイルシステムを操作するための標準クラスとして、FileクラスとDirクラスが用意されています。このうちDirクラスは、ファイルそのものを扱うのではなく、ディレクトリを操作したりファイルを検索するのに使われるクラスです。
次から、このDirクラスの基本について解説します。
Dirクラスは標準クラス
Dirクラスは、Rubyをイストールすると同時に組み込まれる標準クラスで、Rubyのスクリプトを実行しているホストのストレージでディレクトリを操作するための使われます。
なお、ディレクトリとは、UNIXのファイルシステムが基になったLinuxでの呼び方で、WindowsやmacOSのフォルダと同じものです。ファイルを格納するための階層構造を持つ入れ物と言えば理解してもらえるでしょうか。
またDirクラスのメソッドは、パッケージの追加やrequireによる読み込みは不要です。
Dirクラスの役割
Dirクラスには、ディレクトリを操作するメソッドや、ディレクトリ内のファイルを検索するメソッドが用意されています。具体的には、ディレクトリを作ったり、変更したり、削除するメソッドはもちろん、ディレクトリの有無をチェックしたり、特定のファイルを検索するメソッドなどです。
また、Rubyのプログラムの中でカレントディレクトリを設定するとこで、ディレクトリパスの指定を省略できるメソッドもあります。そのためDirクラスには、カレントディレクトリを変更したり、カレントデフィレクトリ内のファイルを検索するためのメソッドも用意されています。
Dirクラスのメソッドの使い方
Dirクラスのメソッドを利用する場合、「Dir.メソッド名」のように直接Dirクラスのメソッド名を記述してください。
また特定のディレクトリを指定する場合、絶対パスと相対パスのどちらも使用できます。絶対パスとはディレクトリ階層の最も上から書く方法で、相対パスとは今のディレクトリから見た位置を指定する方法です。
絶対パスでディレクトリを指定する例
Dir.mkdir('/home/project/datas/test', 0666)
これはLinuxのファイルシステムに新しいディレクトリ/home/project/datas/testを作成する例です。
相対パスでディレクトリを指定する例
Dir.mkdir('../datas/test', 0666)
これはLinuxのファイルシステムで、今のディレクトリから1つ上のディレクトリにあるdatasの下に、新しいディレクトリtestを作成する例です。
Dirクラスで特定のディレクトリを操作する例
先ほど紹介したように、RubyのプログラムでDirクラスを利用する際、特定のディレクトリを操作ケースとカレントディレクトリを使うケースがあります。このうち、特定のディレクトリを操作する例を紹介します。
ディレクトリを作ったり削除する
RubyのDirクラスにはLinuxのコマンド名と同じディレクトリを操作するメソッドがあります。例えばディレクトリを作るメソッドがmkdirメソッドで、ディレクトリを削除するメソッドがrmdirメソッドです。なお、ディレクトリを削除するメソッドは3つあるので使い易いメソッドを利用してください。
ディレクトリを作るメソッドの例
Dir.mkdir('/home/project/datas/test', 0666)
ディレクトリを削除するメソッドの例
Dir.rmdir('/home/project/datas/test') Dir.delete('/home/project/datas/test') Dir.unlink('/home/project/datas/test')
特定のディレクトリ内を調べる
Dirクラスには、特定のディレクトリ名を指定してそのディレクトリを調べるメソッドが幾つも用意されています。例えば、特定のディレクトリの有無をチェックしたり、特定のディレクトリにあるファイル一覧を取得するなどです。
特定のディレクトリ内を調べる例
dir_name = '/home/project/list' if Dir.exitst?(dir_name) files = Dir.entries(dir_name) else p dirname + 'はありません' end
この例は、Dir.exists?で、特定のディレクトリの有無を調べ、Dir.entriesでそのディレクトリにあるファイルの一覧の配列filesを作るプログラムです。
特定のファイルの一覧を作る例
特定のディレクトリを指定し、その中からファイル名が条件に一致するもののみリストを作成する例を次に紹介します。
each_childメソッドを使いファイルの一覧を作る例
dir_name = '/home/project/list' files = [] if Dir.exitst?(dir_name) Dir.each_child(dir_name) { |f| if f.include?(".rb") then files.push(f) end } else p dirname + 'はありません' end
この例で使用しているeach_childメソッドは、特定のディレクトリの”.”と”..”をのぞくファイル名をブロックで評価します。そして、ブロック内のinclude?メソッドで”.rb”に該当するファイルを、配列filesに追加します。
Dirクラスでカレントディレクトリを操作する例
Dirクラスには、ディレクトリを指定するメソッドと指定しないメソッドとがあり、後者はカレントディレクトリに対する操作や検索などのメソッドです。次から、カレントディレクトリを操作する例を紹介します。
カレントデフィレクトリを変更する
Dirクラスにはカレントディレクトリを対象としたメソッドが幾つもあります。そして、そのようなメソッドを使うためには、先にカレントディレクトリを目的のディレクトリに移動し、その後で続いて使いたいメソッドを実行します。
また、カレントディレクトリのパスを調べるメソッドもあるので、何か処理する前にカレントディレクトリをチェックして、対象のディレクトリと違っていたら移動する処理も作れます。
カレントディレクトリのパスを調べる処理
dir_name = '/home/project/list' if Dir.pwd != dir_name then Dir.chdir(dir_name) end
この例は、Dirクラスのpwdメソッドでカレントディレクトリのパスを調べ、もし、変数dir_nameのパスと一致しない場合は、カレントディレクトリのパスを変更する処理です。
カレントディレクトリのファイルリストを作る
先ほど、特定のディレクトリにあるファイルのリストを作る例を紹介しましたが、カレントディレクトリで実行するglobメソッドを使えば、もっと簡単に作れます。その例を次に紹介します。
Dirクラスのglobメソッドを使った例
dir_name = './images' Dir.chdir(dir_name) lists = Dir.glob('*.png') if lists.size > 0 then lists.each { |file| p file } else p '該当するファイルはありません' end
この例は、Dir.chdirメソッドでカレントディレクトリを移動し、Dir.globメソッドでそこにある*.pngファイルの一覧を作るプログラムです。なお、Dir.globメソッドは、テキストの配列を返すので、配列のメソッドを使ったプログラムで利用できます。
まとめ
今回紹介したDirクラスは、ディレクトリを操作したり検索したりする機能を提供する、Rubyに最初から組み込まれたクラスです。そしてWebシステムのサーバーでファイルを管理したり、サーバー管理の自動化などで利用できます。
なおDirクラスには、絶対パスや相対パスで指定するメソッドとカレントディレクトリに対して処理するメソッドがあるので、目的に応じて使い分けてください。