読者です 読者をやめる 読者になる 読者になる

【Ruby】Dirクラスについて

スポンサーリンク

Dir クラスの使用方法についてまとめました。

Kernel.Dir

Dirクラスのメソッドは以下の通りです。

メソッド 引数 処理内容
Dir.pwd - カレントディレクトリのフルパスを返す。他 getwd メソッドも同じ
Dir.home [user] 現在のユーザーまたは指定されたユーザーのホームディレクトリを返す
Dir.chdir [path, block] カレントディレクトリをpathに変更
Dir.chroot path ルートディレクトリをpathに変更
Dir.mkdir path, mode pathで指定されたディレクトリを作成。modeでパーミッション指定
Dir.remdir path ディレクトリを削除。delete, unlink も同じ
Dir.exist? path pathで与えられたディレクトリが存在する場合はtrueを返す。同様の exists? は deprecated
Dir.foreach [path, block] pathの各エントリを表す文字列を引数としてブロックを評価。Dir#each も同じ
Dir.entries path pathに含まれるディレクトリ、ファイル名の配列を返す。Dir#entriesも有
Dir.glob pattern, flag パターンにマッチしたディレクトリ、ファイルを配列で返す。Dir.[] も同じ
Dir.open path, [block] pathのディレクトリを開いてインスタンスを返す。new も同じ
Dir#close - 開いたディレクトリストリームを閉じる。
Dir#path - 開いたディレクトリのパスを返す。to_path も同じ
Dir#pos - ディレクトリストリームの現在の位置を返す。tell も同じ
Dir#read - ディレクトリストリームから次の要素を読み出して返す
Dir#rewind - ディレクトリストリームの読込み位置を先頭に移動

 class Dir (Ruby 2.4.0)

Dir クラスのインスタンスメソッドを使用するにはDir.openまたはDir.newを使用します。Dir のインスタンスを返しますが、ブロックを受け取ることもできます。

Dir.open('/home') do |dir|
  dir.each do |v|
    puts v
  end
end

Dir.chdirはブロックを受け取ることができるため影響を限定することができます。

Dir.chdir("/tmp") do
  p Dir.pwd  #=> "/private/tmp"
end
Dir.pwd
=> "/Users/tasukujp"

Dir クラスのメソッドで渡すパスにチルダ (~) は指定できません。そのため HOME ディレクトリを指定したい、またはチルダを使いたい場合は次のような方法があります。

Dir.chdir("#{ENV['HOME']}/tmp")
=> 0
File.expand_path('~/tmp')
=> "/Users/tasukujp/tmp"
Pathname.new('~/tmp').expand_path.to_s
=> "/Users/tasukujp/tmp"