Pathname表示文件系统上的文件或目录的名称, 但不表示文件本身.

路径名取决于操作系统, 但实验上支持非Unix路径名.

路径名可以是相对的或绝对的.

文件名是否对应真实文件并不重要, 直到你尝试使用该文件, 他才真正读取文件, 如果文件不存在则抛出异常: Errno::ENOENT.

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

这个类的目标是以比Ruby标准提供的更简洁的方式操作文件路径信息. 以下示例说明了不同之处.

File,FileTest以及Dir和FileUtils中的一些功能都以自然的方式包含在内.

它本质上是其他方法的包装,也提供了一些新方法.

Using Pathname

require 'pathname'
pn = Pathname.new("/usr/bin/ruby")
size = pn.size              # 27662
isdir = pn.directory?       # false
dir  = pn.dirname           # Pathname:/usr/bin
base = pn.basename          # Pathname:ruby
dir, base = pn.split        # [Pathname:/usr/bin, Pathname:ruby]
data = pn.read
pn.open { |f| _ }
pn.each_line { |line| _ }

Using standard Ruby

pn = "/usr/bin/ruby"
size = File.size(pn)        # 27662
isdir = File.directory?(pn) # false
dir  = File.dirname(pn)     # "/usr/bin"
base = File.basename(pn)    # "ruby"
dir, base = File.split(pn)  # ["/usr/bin", "ruby"]
data = File.read(pn)
File.open(pn) { |f| _ }
File.foreach(pn) { |line| _ }

Special Feature

p1 = Pathname.new("/usr/lib")   # Pathname:/usr/lib
p2 = p1 + "ruby/1.8"            # Pathname:/usr/lib/ruby/1.8
p3 = p1.parent                  # Pathname:/usr
p4 = p2.relative_path_from(p3)  # Pathname:lib/ruby/1.8
pwd = Pathname.pwd              # Pathname:/home/gavin
pwd.absolute?                   # true
p5 = Pathname.new "."           # Pathname:.
p5 = p5 + "music/../articles"   # Pathname:music/../articles
p5.cleanpath                    # Pathname:articles
p5.realpath                     # Pathname:/home/gavin/articles
p5.children                     # [Pathname:/home/gavin/articles/linux, ...]

Reference

http://ruby-doc.org/stdlib-2.6.2/libdoc/pathname/rdoc/Pathname.html