Ruby的Dir vs File vs Pathname?

时间:2012-08-20 15:01:04

标签: ruby

Ruby的Dir,File和Pathname类有什么区别?他们似乎分享了basenamedirnameglobjoin等常用方法。什么时候使用一个优于另一个?

在将其功能与Dir和File进行比较时,路径名似乎特别奇怪。

3 个答案:

答案 0 :(得分:14)

根据DirFilePathname的Ruby文档,它们似乎有很多共同之处。

DirFile之间的原则不同似乎是Dir假设它正在使用的对象是一个目录而File假定文件。在大多数情况下,它们显然可以互换使用,但即使代码有效,如果使用File使用Dir和使用Pathname的文件操作目录,任何阅读代码的人都可能会感到困惑。

{{1}}看起来是一种定位文件和目录的多操作系统方法。由于Windows和* nix机器以不同的方式处理文件管理,如果您希望脚本在任何地方运行,以特定于操作系统的方式引用文件或目录可能会很麻烦。来自文档:

  

Pathname表示在文件系统中定位文件的路径名。路径名取决于操作系统:Unix,Windows等。路径名域库与本地操作系统的路径名一起使用。但是实验上支持非Unix路径名。

     

它不代表文件本身。路径名可以是相对的或绝对的。直到您尝试引用该文件时,文件是否存在才会发生。

     

路径名是不可变的。它没有破坏性更新的方法。

希望这有帮助。

答案 1 :(得分:4)

Pathname特别有趣,因为它在File和Dir类名中使用该字符串时,可以方便地操作路径并避免来回操作。一个例子:

require 'pathname'

def log_stuff(directory, data)
  path = Pathname.new(directory)
  raise "Directory does not exist" unless path.exist?

  raise "Path given is not a directory" unless path.directory?

  path += "development.log"
  path.open("a") { |io| io.write data }
end

您还可以看到它正在Rails的路径中使用,这也使您能够做一些很酷的事情:

$ rails c
> Rails.root
=> #<Pathname:/home/kibet/code/ruby/sample_app>
> Rails.root.join("config", "database.yml")
=> #<Pathname:/home/kibet/code/ruby/sample_app/config/database.yml>
> _.read
=> "development:\n  adapter: postgresql\n...

而不是File.join(Rails.root, "config", "database.yml")

答案 2 :(得分:3)

最好的资源之一可以是语言文档,在本例中为http://www.ruby-doc.org/

Dir正在使用目录,例子包括列出当前工作目录(pwd),制作目录并删除目录。

文件类似于Dir,而是处理使用文件,例如获取和更改权限,创建文件和删除文件。

路径名很奇怪,正如你所说,因为它确实包含了File的所有功能和Dir的一些功能,但是如果你阅读了文档,它会告诉你它为什么存在。来自http://www.ruby-doc.org/stdlib-1.9.3/libdoc/pathname/rdoc/Pathname.html

  

此类的值是以比标准Ruby提供的更简洁的方式操作文件路径信息。以下示例说明了不同之处。 File,FileTest以及Dir和FileUtils中的一些功能都以一种不足为奇的方式包含在内。它本质上是所有这些的外观,甚至更多。

希望有助于解释事情。