Dir.glob

実践編で特定のディレクトリにあるファイルを扱う。だから、任意のディレクトリにある任意の拡張子のファイルのリストを取得する方法については解説が必須。

説明案(ボツ)。

dataディレクトリにファイル名の末尾が.txtのファイルが置かれている場合、次の方法でファイルのリストを取得できます。

p Dir.glob("data/*.txt")    #=> ["./bar.txt", "./baz.txt"]

しかし、globのパターン指定が正規表現とはまた違うものであるところがややこしい。

説明案2。

プログラムを実行するディレクトリにdataというディレクトリがあって、その中に拡張子が「.txt」のファイルがいくつか置いてあるとします。

filenames = Dir.glob('data/*.txt')
p filenames    #=> ["data/0.txt", "data/1.txt", "data/2.txt"]

次のプログラムは、dataディレクトリにある、拡張子が「.txt」のファイルの中身をすべて表示します。

filenames = Dir.glob('data/*.txt')
filenames.each do |filename|
  text = File.read(filename)
  puts text
end

また変数filenamesや変数filenameを省略して、次のように書くこともできます。

Dir.glob('data/*.txt').each do |filename|
  puts File.read(filename)
end

dataディレクトリに3つファイル「0.txt」、「1.txt」、「2.txt」が置いてある場合、上記のプログラムの実行結果は次のようになります。

0.txt
1.txt
2.txt

Dir.globによってファイル名のリストが配列に格納され、その配列に対してeachメソッドを呼び出して順番に処理しているわけです。

Dir.glob

Dir.globメソッドの引数には検索するファイル名を示すパターンを与えます。パターンは文字列で与えますが、このとき「*」を使うと「*」の部分は任意の文字列にマッチします。Dir.globに渡すパターンは正規表現ではないので注意してください。

パターンにマッチするファイルが見つからなかった場合は空の配列を返します。

うーん、そもそもパスについての説明が必要だよな。環境依存の話は大丈夫かな。

ディレクトリ名を含んだファイル名

プログラムを実行すディレクトリからの相対パスでファイル名を参照することができます。

ファイル名はRubyを実行しているディレクトリからの相対パスを指定する必要があります。絶対パスでファイルにアクセスする方法もあります。詳しくはコラムを参照してください。

絶対パスを指定する

  • "/home/dan/data"

Windows絶対パス指定をする場合はどう書くのだろう?Dir.pwd を実行すると絶対パスが返る。

p Dir.pwd    #=> "C:/tmp"
  • "C:/work/data" …… Cドライブのworkディレクトリの中のdataファイル(C:\work\data)