chroju.dev/blog

the world as code

Ruby基礎復習(9) Dirクラス

『パーフェクトRuby』p.208より。

Dirクラスは基本としてカレントディレクトリ情報を持っていて、それを元としてディレクトリ操作ができる。従って多くの操作を特異メソッドで行うことができる。

Dir.pwd # => "/Users/chroju"
Dir.chdir("/tmp")
Dir.pwd # => "/tmp"
Dir.home # => "/Users/chroju"

ディレクトリに含まれるファイルはDir.entriesで配列として返り、Dir.foreachでEnumerableとして返る。またDir.globにより、パターンにマッチするファイルパスを配列で返すこともできる。Dir.globDir[]と同義である。引数のディレクトリが存在するか確認する場合はDir.exists?を用いる。

Dir.entries('.') # => [".", "..", "bar", "foo", "baz"]
Dir.foreach('.') {|d|
  p d
} # => ".", "..", "bar", "foo", "baz"
Dir.glob('ba*') # => ["bar", "baz"]
Dir['ba*'] # => ["bar", "baz"]
Dir.exists?("hoo") # => false

ディレクトリの削除、生成等も特異メソッドにて。

Dir.mkdir 'foo', 0755 # パーミッション0755でfooディレクトリを生成
Dir.rmdir 'foo' # fooディレクトリを削除するが、対象ディレクトリは空である必要がある
Dir.delete 'foo' # Dir.rmdirと同義
Dir.unlink 'foo' # Dir.rmdirと同義

Dir.openすると、Dirオブジェクトを取得することができ、インスタンスメソッドによる操作が可能になる。Dirオブジェクトは読み込み位置を持っていて、ディレクトリ内のファイル名を1つずつ読み込ませることができる。

dir = Dir.open('.')
dir.path # => "/temp" (現在のファイルパス)
dir.pos # => 0 (現在の読み込み位置)
dir.pos = 1 # 読み込み位置を移動
dir.read # => ".."
dir.rewind # 読み込み位置を先頭に戻す
dir.read # => "."
dir.each {|f| p f} # => ".", "..", "bar", "baz", "foo"