类 Pathname

Pathname 表示文件系统中文件或目录的名称,但不是文件本身。

路径名取决于操作系统:Unix、Windows 等。这个库适用于本地操作系统的路径名,但是实验性地支持非 Unix 路径名。

Pathname 可以是相对的或绝对的。只有在您尝试引用文件时,文件是否存在才重要。

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

这个类的目标是以比标准 Ruby 更简洁的方式操作文件路径信息。下面的示例演示了差异。

来自 FileFileTest所有功能,以及一些来自 DirFileUtils 的功能都以一种不令人惊讶的方式被包含进来。它本质上是所有这些的门面,而且更多。

示例

示例 1:使用 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| _ }

示例 2:使用标准 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| _ }

示例 3:特殊功能

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, ...]

功能分解

核心方法

这些方法实际上是在操作一个 String,因为路径就是这样。除了 mountpoint?childreneach_childrealdirpathrealpath 之外,这些方法都不会访问文件系统。

File 状态谓词方法

这些方法是 FileTest 的门面

File 属性和操作方法

这些方法是 File 的门面

目录方法

这些方法是 Dir 的门面

IO

这些方法是 IO 的门面

实用工具

这些方法是 FindFileUtils 和其他方法的混合体

Method 文档

正如上面部分所示,Pathname 中的大多数方法都是门面。例如,这些方法的文档通常只是说“请参阅 FileTest.writable?”,因为您应该已经熟悉原始方法,并且它的文档(例如通过 ri)将包含更多信息。在某些情况下,后面会有一个简短的描述。