21

Ruby 的 Dir、File 和 Pathname 类有什么区别?它们似乎共享常用方法,如basenamedirnameglobjoin。什么时候使用一种优于另一种?

在将其功能与 Dir 和 File 进行比较时,Pathname 似乎特别特别。

4

3 回答 3

17

根据DirFilePathname的 Ruby 文档,它们肯定看起来有很多共同点。

Dir两者之间的不同原则File似乎是Dir假设它正在使用的对象是一个目录并File假设文件。对于大多数目的,它们显然可以互换使用,但即使代码有效,如果您File使用Dir.

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

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

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

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

希望这可以帮助。

于 2012-08-20T16:20:44.007 回答
7

路径名特别有趣,因为它具有操作路径的便利性,并且在 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").

于 2012-08-20T16:38:09.083 回答
6

最好的资源之一可能是语言文档,在这种情况下,它是http://www.ruby-doc.org/

Dir 正在处理目录,示例包括列出当前工作目录 ( pwd)、创建目录和删除它们。

File 与 Dir 类似,但处理的是使用 Files,例如获取和更改权限、创建文件和删除它们。

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

此类的价值在于以比标准 Ruby 提供的更简洁的方式操作文件路径信息。下面的示例演示了差异。File、FileTest 的所有功能以及 Dir 和 FileUtils 的一些功能都包含在内,这并不奇怪。它本质上是所有这些的门面,甚至更多。

希望这有助于解释事情。

于 2012-08-20T16:05:10.800 回答