Dir

为实现目录流操作而设置的类,它可以依次返回目录中的元素。

超类:

包含的模块:

类方法:

Dir[pattern]
Dir.glob(pattern)
Dir.glob(pattern) {|file| ...}
Dir.glob(pattern[, flags]) ((<ruby 1.7 特性>))
Dir.glob(pattern[, flags]) {|file| ...} ((<ruby 1.7 特性>))

以字符串数组的形式返回通配符匹配结果。若指定了块的话,将以匹配成功的文件为参数,依次计算该块,然后返回nil。

可以一次指定多个pattern,此时需要使用空白(space,tab,换行)或"\0"将它们分割开来。

p Dir.glob("f* b*")
=> ["foo", "bar"]

可用的通配符如下。

  • *

    匹配任何字符串,包括空字符串。

  • ?

    匹配任何一个字符。

  • [ ]

    只要匹配方括号中任何一个字符即可。若使用-则表示字符范围。若方括号中的首字符是^时,表示匹配^后的字符以外的任意字符。(在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 ... (此后无限延伸)进行匹配。

ruby 1.7 特性:可使用反斜线对通配符进行转义处理。(请注意,在双引号内的字符串中必须进行2层转义)另外,空白类字符将失去特殊意义(但"\0"依然有效)。若想进行与1.6版本相同的处理时,应使用String#chomp等将多余的空白去掉,或使用gsub(/[\t\n]/,"\0"])进行转换即可。

ruby 1.7 特性:可以为第2可选参数指定一个类似于File.fnmatch中所使用的标识。指定标识后就可改变匹配的运作情况。

Dir.chdir([path])
Dir.chdir([path]) {|path| ... } ((<ruby 1.7 特性>))

将当前目录改为path。若省略path时,则会调用环境变量HOMELOGDIR。若它们中包含设定值时,就将当前目录改为它们的值。

若当前目录变更成功就返回0,若失败则引发Errno::EXXX异常。

ruby 1.7 特性:若指定了块的话,则只会在块的执行过程中变更当前目录。这等价于

savedir = Dir.pwd
Dir.chdir(newdir)
begin
  ...
ensure
  Dir.chdir(savedir)
end

此时,带块方法的返回值就是块的执行结果。

Dir.chroot(path)

将根目录改为path。请参考chroot(2)。只有超级用户才能改变根目录。

您将无法还原到原来的根目录。

根目录变更成功时返回0,失败时将引发Errno::EXXX异常。

Dir.delete(path)
Dir.rmdir(path)
Dir.unlink(path)

删除目录。目录必须为空。

若删除成功则返回0,若失败则引发Errno::EXXX异常。

Dir.entries(path)

以数组形式返回path目录中所含的文件项名。等同于

def dir_s_entries( path )
  Dir.open(path) {|d|
    return d.to_a
  }
end
Dir.foreach(path) {|file| ...}

针对path目录中的元素的迭代器。该方法的运作方式如下。

dir = Dir.open(path)
begin
  dir.each {|file|
     ...
  }
ensure
  dir.close
end

返回nil

Dir.getwd
Dir.pwd

返回当前目录的完整路径。

若无法取得当前目录时会引发Errno::EXXX异常(一般不会失败)。

Dir.mkdir(path[, mode])

生成新目录path。permission的值要取决于mode(默认值0777)和umask的按位与计算结果(mode & ~umask)(请参考mkdir(2))。

若成功生成新目录就返回0,若失败则引发Errno::EXXX异常。

Dir.new(path)
Dir.open(path)
Dir.open(path) {|dir| ...}

打开并返回一个针对path的目录流。若打开失败则引发Errno::EXXX异常。

open()方法可以带块。若带块调用时,将执行该块。当块的运行结束时,目录将被自动关闭。

ruby 1.7 特性:带块调用该方法的返回值为块的运行结果。在1.6版本中,其返回值恒为nil。

方法:

close

关闭目录流。此后若再对目录进行操作则会引发IOError异常。

若成功关闭则返回nil。若失败则引发IOError异常。

each {|item| ... }

为目录中的各个元素计算块的内容。返回self。

path ((<ruby 1.7 特性>))

以字符串形式返回当前打开目录的路径名。

pos
tell

以整数形式返回目录流的当前位置。

Dir.open("/tmp") {|d|
    d.each {|f|
      p d.pos
    }
}
pos=(pos)
seek(pos)

将目录流的读入位置移动到pospos必须是使用Dir#tell所得到值。

pos=返回右边,而seek则返回self

read

从目录流中读出并返回下一个元素。若读到最后一个元素则返回nil

若读取目录失败则引发Errno::EXXX异常。

rewind

将目录流的读取位置移到开头。返回self