Ruby 3.3 リファレンスマニュアル

class Dir

[edit]

要約

ディレクトリの操作を行うためのクラスです。

目次

特異メソッド
インスタンスメソッド
追加されるメソッド

継承しているメソッド

Enumerableから継承しているメソッド

特異メソッド

self[*pattern, base: nil, sort: true] -> [String][permalink][rdoc][edit]
glob(pattern, flags = 0, base: nil, sort: true) -> [String]
glob(pattern, flags = 0, base: nil, sort: true) {|file| ...} -> nil

ワイルドカードの展開を行い、パターンにマッチするファイル名を文字列の配列として返します。パターンにマッチするファイルがない場合は空の配列を返します。

ブロックが与えられたときはワイルドカードにマッチしたファイルを引数にそのブロックを 1 つずつ評価して nil を返します

[PARAM] pattern:
パターンを文字列か配列で指定します。配列を指定すると複数のパターンを指定できます。
[PARAM] flags:
File.fnmatch に指定できるフラグと同様のフラグを指定できます。このフラグを指定することでマッチの挙動を変更できます。
p Dir.glob("*")                    #=> ["bar", "foo"]
p Dir.glob("*", File::FNM_DOTMATCH)  #=> [".", "bar", "foo"]
[PARAM] base:
カレントディレクトリの代わりに相対パスの基準にするベースディレクトリを指定します。指定した場合、結果の頭にはベースディレクトリはつかないので、絶対パスが必要な場合はベースディレクトリを追加する必要があるでしょう。
[PARAM] sort:
true ならワイルドカードや文字セット(鈎括弧)にマッチした結果をバイナリとして昇順にソートします。 false を指定するとソートせず2.7以前と同じ挙動になります。 true の場合でも、配列で指定した複数のパターンや波括弧での順番は保存されます。

ワイルドカードには以下のものがあります。これらはバックスラッシュによりエスケープできます。ダブルクォートの文字列中では 2 重にエスケープする必要があることに注意してください。ワイルドカードはデフォルトではファイル名の先頭の "." にマッチしません。

*

空文字列を含む任意の文字列と一致します。

?

任意の一文字と一致します。

[ ]

鈎括弧内のいずれかの文字と一致します。- でつながれた文字は範囲を表します。鈎括弧の中の最初の文字が ^ である時には含まれない文字と一致します。 ^ の代わりに ksh や POSIX shell のように ! も同じ意味で使えます。

{ }

コンマで区切られた文字列の組合せに展開します。例えば、 foo{a,b,c} は fooa, foob, fooc に展開されそれぞれに対してマッチ判定を行います。

括弧は入れ子にできます。例えば、 {foo,bar{foo,bar}} は foo, barfoo, barbar のそれぞれにマッチします。

**/

ワイルドカード */ の0回以上の繰り返しを意味し、ディレクトリを再帰的にたどってマッチを行います。例えば, foo/**/bar は foo/bar, foo/*/bar, foo/*/*/bar ... (以下無限に続く)に対してそれぞれマッチ判定を行います。

# 一般的な例
p Dir.glob("*")          #=> ["foo", "bar", "baz"]
p Dir.glob("./b*")       #=> ["./bar", "./baz"]      先頭に "./" が付いている。
p Dir.glob("*/")         #=> ["foo/"]                ディレクトリのみにマッチする。
p Dir.glob("wrong_name") #=> []                      マッチしないと空の配列を返す。

Dir.glob("b*") {|f| p f }

#=> "bar"
#   "baz"

# 複数のパターンを指定する例
p Dir.glob(["f*", "b*"]) # => ["foo", "bar"]
p Dir["f*", "b*"]        # => ["foo", "bar"]

# ワイルドカードの例
p Dir.glob("*")          #=> ["foo", "bar"]
p Dir.glob("fo?")        #=> ["foo"]
p Dir.glob("[^f]*")      #=> ["bar"]
p Dir.glob("{b,f}*")     #=> ["bar", "foo"]

# ベースディレクトリの例
rbfiles = File.join("**", "*.rb")
p Dir.glob(rbfiles)                 #=> ["main.rb",
                                    #    "lib/song.rb",
                                    #    "lib/song/karaoke.rb"]
p Dir.glob(rbfiles, base: "lib")    #=> ["song.rb",
                                    #    "song/karaoke.rb"]
chdir -> 0[permalink][rdoc][edit]
chdir(path) -> 0
chdir {|path| ... } -> object
chdir(path) {|path| ... } -> object

カレントディレクトリを path に変更します。

path を省略した場合、環境変数 HOME または LOGDIR が設定されていればそのディレクトリに移動します。カレントディレクトリの変更に成功すれば 0 を返します。

ブロックが指定された場合、カレントディレクトリの変更はブロックの実行中に限られます。ブロックの実行結果を返します。

[PARAM] path:
ディレクトリのパスを文字列で指定します。
[EXCEPTION] Errno::EXXX:
失敗した場合に発生します。
Dir.chdir("/var/spool/mail")
p Dir.pwd                    #=> "/var/spool/mail"
Dir.chdir("/tmp") do
  p Dir.pwd                  #=> "/tmp"
end 
p Dir.pwd                    #=> "/var/spool/mail"

# ~ は展開されない
p Dir.chdir("~/.ssh")        # => Errno::ENOENT

[SEE_ALSO] Dir.fchdir

children(path) -> [String]Ruby 2.5.0 から[permalink][rdoc][edit]
children(path, encoding: enc) -> [String]

ディレクトリ path に含まれるファイルエントリ名のうち、 "." と ".." をのぞいた配列を返します。

[PARAM] path:
ディレクトリのパスを文字列で指定します。
[PARAM] encoding:
ディレクトリのエンコーディングを文字列か Encoding オブジェクトで指定します。省略した場合はファイルシステムのエンコーディングと同じになります。
[EXCEPTION] Errno::EXXX:
失敗した場合に発生します。
p Dir.children('.') #=> ["bar", "foo"]

[SEE_ALSO] Dir#children

[SEE_ALSO] Dir.each_child

[SEE_ALSO] Dir.entries

chroot(path) -> 0[permalink][rdoc][edit]

ルートディレクトリを path に変更します。

スーパーユーザだけがルートディレクトリを変更できます。ルートディレクトリの変更に成功すれば 0 を返します。各プラットフォームのマニュアルの chroot の項も参照して下さい。

[PARAM] path:
ディレクトリのパスを文字列で指定します。
[EXCEPTION] Errno::EXXX:
失敗した場合に発生します。
p Dir.glob("*")   #=> ["file1", "file2]
Dir.chroot("./")
p Dir.glob("/*")  #=> ["/file1", "/file2]

[SEE_ALSO] http://opengroup.org/onlinepubs/007908799/xsh/chroot.html

delete(path) -> 0[permalink][rdoc][edit]
rmdir(path) -> 0
unlink(path) -> 0

ディレクトリを削除します。ディレクトリは空でなければいけません。ディレクトリの削除に成功すれば 0 を返します。

[PARAM] path:
ディレクトリのパスを文字列で指定します。
[EXCEPTION] Errno::EXXX:
失敗した場合に発生します。
Dir.delete("/tmp/hoge-jbrYBh.tmp")
each_child(path) {|file| ...} -> nilRuby 2.5.0 から[permalink][rdoc][edit]
each_child(path, encoding: enc) {|file| ...} -> nil
each_child(path) -> Enumerator
each_child(path, encoding: enc) -> Enumerator

ディレクトリ path の "." と ".." をのぞく各エントリを表す文字列を引数として、ブロックを評価します。

ブロックが与えられなかった場合、各エントリを文字列として保持する Enumerator オブジェクトを返します。

[PARAM] path:
ディレクトリのパスを文字列で指定します。
[PARAM] encoding:
ディレクトリのエンコーディングを文字列か Encoding オブジェクトで指定します。省略した場合はファイルシステムのエンコーディングと同じになります。
[EXCEPTION] Errno::EXXX:
失敗した場合に発生します。
Dir.each_child('.'){|f|
  p f
}
#=> "bar"
#   "foo"

[SEE_ALSO] Dir.foreach

[SEE_ALSO] Dir.children

[SEE_ALSO] Dir#each_child

empty?(path_name) -> boolRuby 2.4.0 から[permalink][rdoc][edit]

path_name で与えられたディレクトリが空の場合に真を返します。ディレクトリでない場合や空でない場合に偽を返します。

p Dir.empty?('.')    #=> false
p Dir.empty?(IO::NULL) #=> false
require 'tmpdir'
p Dir.mktmpdir { |dir| Dir.empty?(dir) } #=> true
[PARAM] path_name:
確認したいディレクトリ名。
entries(path) -> [String][permalink][rdoc][edit]
entries(path, encoding: Encoding.find("filesystem")) -> [String]

ディレクトリ path に含まれるファイルエントリ名の配列を返します。

[PARAM] path:
ディレクトリのパスを文字列で指定します。
[PARAM] encoding:
ディレクトリのエンコーディングを文字列か Encoding オブジェクトで指定します。省略した場合はファイルシステムのエンコーディングと同じになります。
[EXCEPTION] Errno::EXXX:
失敗した場合に発生します。
p Dir.entries('.') #=> [".", "..", "bar", "foo"]

[SEE_ALSO] Dir.foreach

[SEE_ALSO] Dir.children

exist?(file_name) -> boolRuby 1.9.3 から[permalink][rdoc][edit]

file_name で与えられたディレクトリが存在する場合に真を返します。そうでない場合は、偽を返します。

[PARAM] file_name:
存在を確認したいディレクトリ名。
p Dir.exist?(".")    # => true
p File.directory?(".") # => true

[SEE_ALSO] File.directory?

fchdir(fd) -> 0Ruby 3.3 から[permalink][rdoc][edit]
fchdir(fd) { ... } -> object

カレントディレクトリを、整数のファイルディスクリプタ fd が指すディレクトリに変更します。

ファイルディスクリプタを UNIX ソケット経由で渡したり子プロセスに渡したりする場合、Dir.chdir の代わりに fchdir を使うと TOCTOU (time-of-check to time-of-use) 脆弱性を避けられます。

ブロックを指定しない場合、カレントディレクトリを fd の指すディレクトリに変更し、 0 を返します。

ブロックを指定した場合、カレントディレクトリの変更はブロックの実行中に限られます。ブロックの実行結果を返します。

[PARAM] fd:
ディレクトリを指すファイルディスクリプタを整数で指定します。
[EXCEPTION] Errno::EXXX:
失敗した場合に発生します。
Dir.chdir("/var/spool/mail")
p Dir.pwd            # => "/var/spool/mail"

dir = Dir.new("/usr")
Dir.fchdir(dir.fileno)
p Dir.pwd            # => "/usr"

[SEE_ALSO] Dir.chdir, Dir#fileno, Dir.for_fd

for_fd(fd) -> DirRuby 3.3 から[permalink][rdoc][edit]

整数のディレクトリファイルディスクリプタ fd が指すディレクトリを表す、新しい Dir オブジェクトを返します。

返される Dir オブジェクトには対応するパスがないため、 Dir#path は nil を返します。

このメソッドは POSIX 2008 で定義された fdopendir() を使用します。 POSIX 非対応のプラットフォームでは実装されておらず、 NotImplementedError が発生します。

[PARAM] fd:
ディレクトリを指すファイルディスクリプタを整数で指定します。
require 'tmpdir'

Dir.mktmpdir do |tmpdir|
  d0 = Dir.new(tmpdir)
  d1 = Dir.for_fd(d0.fileno)

  p d1.class  # => Dir
  p d0.path   # => tmpdir のパス
  p d1.path   # => nil
  d0.close
end

[SEE_ALSO] Dir#fileno, Dir#path, Dir.fchdir

foreach(path) {|file| ...} -> nil[permalink][rdoc][edit]
foreach(path, encoding: Encoding.find("filesystem")) {|file| ...} -> nil
foreach(path) -> Enumerator
foreach(path, encoding: Encoding.find("filesystem")) -> Enumerator

ディレクトリ path の各エントリを表す文字列を引数として、ブロックを評価します。

ブロックが与えられなかった場合、各エントリを文字列として保持する Enumerator オブジェクトを返します。

[PARAM] path:
ディレクトリのパスを文字列で指定します。
[PARAM] encoding:
ディレクトリのエンコーディングを文字列か Encoding オブジェクトで指定します。省略した場合はファイルシステムのエンコーディングと同じになります。
[EXCEPTION] Errno::EXXX:
失敗した場合に発生します。
Dir.foreach('.'){|f|
  p f
}
#=> "."
#   ".."
#   "bar"
#   "foo"

[SEE_ALSO] Dir.entries

[SEE_ALSO] Dir.each_child

getwd -> String[permalink][rdoc][edit]
pwd -> String

カレントディレクトリのフルパスを文字列で返します。

[EXCEPTION] Errno::EXXX:
カレントディレクトリの取得に失敗した場合に発生します(が、普通は失敗することはありません)。
p Dir.chdir("/tmp") #=> 0
p Dir.getwd         #=> "/tmp"
home -> String | nilRuby 1.9.3 から[permalink][rdoc][edit]
home(user) -> String | nil

現在のユーザまたは指定されたユーザのホームディレクトリを返します。

Dir.home や Dir.home("root") は File.expand_path("~") や File.expand_path("~root") とほぼ同じです。

p Dir.home        # => "/home/vagrant"
p Dir.home("root")  # => "/root"

[SEE_ALSO] File.expand_path

mkdir(path, mode = 0777) -> 0[permalink][rdoc][edit]

path で指定された新しいディレクトリを作ります。パーミッションは mode で指定された値に umask をかけた値 (mode & ~umask) になります。 mkdir(2) も参照して下さい。ディレクトリの作成に成功すれば 0 を返します。

[PARAM] path:
ディレクトリのパスを文字列で指定します。
[PARAM] mode:
ディレクトリのモードを整数で与えます。
[EXCEPTION] Errno::EXXX:
ディレクトリの作成に失敗した場合に発生します。
p File.umask                                  #=> 2
Dir.mkdir('t', 0666)
p "%#o" % (07777 & File.stat('t').mode)  #=> "0664"

[SEE_ALSO] FileUtils.#makedirs

new(path) -> Dir[permalink][rdoc][edit]
new(path, encoding: Encoding.find("filesystem")) -> Dir
open(path) -> Dir
open(path, encoding: Encoding.find("filesystem")) -> Dir
open(path) {|dir| ...} -> object
open(path, encoding: Encoding.find("filesystem")) {|dir| ...} -> object

path に対するディレクトリストリームをオープンして返します。

ブロックを指定して呼び出した場合は、ディレクトリストリームを引数としてブロックを実行します。ブロックの実行が終了すると、ディレクトリは自動的にクローズされます。ブロックの実行結果を返します。

[PARAM] path:
ディレクトリのパスを文字列で指定します。
[PARAM] encoding:
ディレクトリのエンコーディングを文字列か Encoding オブジェクトで指定します。省略した場合はファイルシステムのエンコーディングと同じになります。
[EXCEPTION] Errno::EXXX:
オープンに失敗した場合に発生します。
例: Dir.new
require 'tmpdir'

Dir.mktmpdir do |tmpdir|
  d = Dir.new(tmpdir)
  p d.class         # => Dir
  p d.read.encoding # => #<Encoding:UTF-8>
  d.close

  d = Dir.new(tmpdir, encoding: Encoding::UTF_8)
  p d.class         # => Dir
  p d.read.encoding # => #<Encoding:UTF-8>
  d.close
end
例: Dir.open
require 'tmpdir'

Dir.mktmpdir do |tmpdir|
  d = Dir.open(tmpdir, encoding: Encoding::UTF_8)
  p d.class         # => Dir
  p d.read.encoding # => #<Encoding:UTF-8>
  d.close

  Dir.open(tmpdir, encoding: Encoding::UTF_8) do |d|
    p d.class         # => Dir
    p d.read.encoding # => #<Encoding:UTF-8>
  end
end

インスタンスメソッド

children -> [String]Ruby 2.6.0 から[permalink][rdoc][edit]

ディレクトリのファイルエントリ名のうち、 "." と ".." をのぞいた配列を返します。

[EXCEPTION] IOError:
既に self が close している場合に発生します。
Dir.open('.'){|d|
  p d.children # => ["bar", "foo"]
}

[SEE_ALSO] Dir.children

close -> nil[permalink][rdoc][edit]

ディレクトリストリームをクローズします。クローズに成功すれば nil を返します。

d = Dir.new(".")
p d.close  # => nil
each {|item| ... } -> self[permalink][rdoc][edit]
each -> Enumerator

ディレクトリの各エントリを表す文字列を引数として、ブロックを評価します。

ブロックが与えられなかった場合、各エントリを文字列として保持する Enumerator オブジェクトを返します。

[EXCEPTION] IOError:
既に自身が close している場合に発生します。
Dir.open('.').each{|f|
  p f
}
#=> "."
#   ".."
#   "bar"
#   "foo"

[SEE_ALSO] Dir#each_child

each_child {|item| ... } -> selfRuby 2.6.0 から[permalink][rdoc][edit]
each_child -> Enumerator

ディレクトリの "." と ".." をのぞく各エントリを表す文字列を引数として、ブロックを評価します。

ブロックが与えられなかった場合、各エントリを文字列として保持する Enumerator オブジェクトを返します。

[EXCEPTION] IOError:
既に self が close している場合に発生します。
Dir.open('.').each_child{|f|
  p f
}
#=> "bar"
#   "foo"

[SEE_ALSO] Dir#each

[SEE_ALSO] Dir.each_child

fileno -> IntegerRuby 2.2.0 から[permalink][rdoc][edit]

self に関連づけられたファイル記述子を表す整数を返します。

p Dir.open("..") { |d| d.fileno } # => 8

本メソッドでは POSIX 2008 で定義されている dirfd() 関数を使用します。

[EXCEPTION] NotImplementedError:
Windows などの dirfd() 関数が存在しないプラットフォームで発生します。
[EXCEPTION] IOError:
既に自身が close している場合に発生します。

[SEE_ALSO] IO#fileno

inspect -> String[permalink][rdoc][edit]

self の情報を人間に読みやすい文字列にして返します。

p Dir.open("/") { |d| d.inspect } # => "#<Dir:/>"
path -> String[permalink][rdoc][edit]
to_path -> StringRuby 1.9.3 から

オープンしているディレクトリのパス名を文字列で返します。

Dir.open("..") do |d|
  p d.path    # => ".."
  p d.to_path # => ".."
end
pos -> Integer[permalink][rdoc][edit]
tell -> Integer

ディレクトリストリームの現在の位置を整数で返します。

[EXCEPTION] IOError:
既に自身が close している場合に発生します。
Dir.open("/tmp") {|d|
  d.each {|f|
    p d.pos
  }
}
pos=(pos)[permalink][rdoc][edit]
seek(pos) -> self

ディレクトリストリームの読み込み位置を pos に移動させます。 pos は Dir#tell で与えられた値でなければなりません。

[PARAM] pos:
変更したい位置を整数で与えます。
[EXCEPTION] IOError:
既に自身が close している場合に発生します。
Dir.open("testdir") do |d|
  p d.read                 # => "."
  i = d.tell               # => 12
  p d.read                 # => ".."
  p d.seek(i)              # => #<Dir:0x401b3c40>
  p d.read                 # => ".."
end
read -> String | nil[permalink][rdoc][edit]

ディレクトリストリームから次の要素を読み出して返します。最後の要素まで読み出していれば nil を返します。

[EXCEPTION] Errno::EXXX:
ディレクトリの読み出しに失敗した場合に発生します。
[EXCEPTION] IOError:
既に自身が close している場合に発生します。
require 'tmpdir'

Dir.mktmpdir do |tmpdir|
  File.open("#{tmpdir}/test1.txt", "w") { |f| f.puts("test1") }
  File.open("#{tmpdir}/test2.txt", "w") { |f| f.puts("test2") }
  Dir.open(tmpdir) do |d|
    p d.read   # => "."
    p d.read   # => ".."
    p d.read   # => "test1.txt"
    p d.read   # => "test2.txt"
    p d.read   # => nil
  end
end
rewind -> self[permalink][rdoc][edit]

ディレクトリストリームの読み込み位置を先頭に移動させます。

[EXCEPTION] IOError:
既に自身が close している場合に発生します。
Dir.open("testdir") do |d|
  p d.read   # => "."
  p d.rewind # => #<Dir:0x401b3fb0>
  p d.read   # => "."
end

追加されるメソッド

mktmpdir(prefix_suffix = nil, tmpdir = nil) -> String[permalink][rdoc][edit] [added by tmpdir]
mktmpdir(prefix_suffix = nil, tmpdir = nil) {|dir| ... } -> object [added by tmpdir]

一時ディレクトリを作成します。

作成されたディレクトリのパーミッションは 0700 です。

ブロックが与えられた場合は、ブロックの評価が終わると作成された一時ディレクトリやその配下にあったファイルを FileUtils.#remove_entry を用いて削除し、ブロックの値をかえします。ブロックが与えられなかった場合は、作成した一時ディレクトリのパスを返します。この場合、このメソッドは作成した一時ディレクトリを削除しません。

[PARAM] prefix_suffix:
nil の場合は、'd' をデフォルトのプレフィクスとして使用します。サフィックスは付きません。文字列が与えられた場合は、その文字列をプレフィクスとして使用します。サフィックスは付きません。 2 要素の配列が与えられた場合は、一つ目の要素をプレフィクス、二つ目の要素をサフィックスとして使用します。
[PARAM] tmpdir:
nil の場合は Dir.tmpdir を使用します。そうでない場合は、そのディレクトリを使用します。
使用例
require 'tmpdir'

puts Dir.tmpdir
# 出力例: 動作環境により出力は異なります。
#=> /cygdrive/c/DOCUME~1/kouya/LOCALS~1/Temp
Dir.mktmpdir{|dir| 
  puts dir
  # 出力例: 一時ディレクトリ の名前の先頭に'd' をつける。
  #=> /cygdrive/c/DOCUME~1/kouya/LOCALS~1/Temp/d20081011-4524-1m69psi
  #                                            ^                    
}
Dir.mktmpdir("foo"){|dir|
  puts dir
  # 出力例:一時ディレクトリ の名前の先頭に'foo' をつける。
  #=> /cygdrive/c/DOCUME~1/kouya/LOCALS~1/Temp/foo20081011-4824-pjvhwx
  #                                            ^^^                    
}
Dir.mktmpdir(["foo", "bar"]){|dir| 
  puts dir
  # 出力例: 一時ディレクトリの名前の先頭に'foo' 、最後に'bar'をつける。
  #=> /cygdrive/c/DOCUME~1/kouya/LOCALS~1/Temp/foo20081011-5624-1hyxrqbbar
  #                                            ^^^                     ^^^
}
  
Dir.mktmpdir(nil, "/var/tmp") {|dir|
  puts dir
  # 出力例: tmpdir の作成先が'/var/tmp'となる。
  #         さらに、一時ディレクトリ の名前の先頭に'd' をつける。
  #=> /var/tmp/d20081011-5304-h6b13j
}
  
memory_dir = nil
Dir.mktmpdir {|dir|
  memory_dir = dir
  File.open("#{dir}/foo", "w") { |fp|
   fp.puts "hogehoge"
  }
}
# ブロックを抜けたら、テンポラリディレクトリは消される。
p FileTest.directory?(memory_dir) #=> false
  
dir = Dir.mktmpdir
# ブロックを与えない場合は、ディレクトリは存在する。
begin
  File.open("#{dir}/foo", "w") { |fp|
    fp.puts "hogehoge"
  }
ensure
  FileUtils.remove_entry_secure dir
end
p FileTest.directory?(dir) #=> false
[EXCEPTION] ArgumentError:
tmpdirが全てのユーザから書き込み可能かつ、sticky ビットが立っていない場合に発生します。作成する一時ディレクトリを安全に削除できないためです。アプリケーションは一時ディレクトリを他のユーザから書き込める権限に変更すべきではありません。
tmpdir -> String[permalink][rdoc][edit] [added by tmpdir]

テンポラリファイルを作成するのに使うディレクトリ(テンポラリディレクトリ)の絶対パスを文字列として返します。 $SAFE によって返す文字列は変わります。

# WindowsXPの場合

require "tmpdir"

p Dir.tmpdir #=> "C:/DOCUME~1/taro3/LOCALS~1/Temp"
$SAFE = 1
p Dir.tmpdir #=> "C:/WINDOWS/temp"

# Linuxの場合 /tmp に加え、環境変数 ENV['TMPDIR'], ENV['TMP'], ENV['TEMP'], ENV['USERPROFILE']を参照します