Ruby的Dir,File和Pathname类有什么区别?他们似乎分享了basename
,dirname
,glob
和join
等常用方法。什么时候使用一个优于另一个?
在将其功能与Dir和File进行比较时,路径名似乎特别奇怪。
答案 0 :(得分:14)
根据Dir,File和Pathname的Ruby文档,它们似乎有很多共同之处。
Dir
和File
之间的原则不同似乎是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中的一些功能都以一种不足为奇的方式包含在内。它本质上是所有这些的外观,甚至更多。
希望有助于解释事情。