1

我对以下方法的实用性感到困惑File Class

 1. File::absolute_path
 2. File::realdirpath
 3. File::realpath
 4. File::expand_path

我在下面尝试了什么:

irb(main):001:0> Dir.pwd
=> "C:/Users/Matt"
irb(main):002:0> Dir.chdir('D:\VB Script\excel_ie_wsh')
=> 0
irb(main):003:0> Dir.pwd
=> "D:/VB Script/excel_ie_wsh"
irb(main):005:0> File.realdirpath('\VB Script\excel_ie_wsh')
=> "/VB Script/excel_ie_wsh"
irb(main):006:0> File.realpath('\VB Script\excel_ie_wsh')
=> "/VB Script/excel_ie_wsh"
irb(main):007:0> File.absolute_path('\VB Script\excel_ie_wsh')
=> "D:/VB Script/excel_ie_wsh"
irb(main):008:0> File.realpath('readme.txt')
=> "D:/VB Script/excel_ie_wsh/readme.txt"
irb(main):009:0> File.realdirpath('readme.txt')
=> "D:/VB Script/excel_ie_wsh/readme.txt"
irb(main):012:0> File.absolute_path('readme.txt')
=> "D:/VB Script/excel_ie_wsh/readme.txt"
irb(main):013:0>

问题:

  1. 为什么File.realdirpathFile.realpath产生相同的输出?
  2. 有何File.realpath不同?File.absolute_path
  3. 与有何absolute_path(file_nam)不同?absolute_path(file_name[, dir_string] )
  4. 与有何realdirpath(pathname)不同?realdirpath(pathname [, dir_string])
4

2 回答 2

4

为什么 File.realdirpath 和 File.realpath 产生相同的输出?

根据 ruby​​-doc,这两种方法之间的唯一区别是路径名的最后一个组件是否必须存在。realdirpath不在乎,as哪里realpath会抛出异常。

例如,当获取一个不存在的文件的路径时:

irb(main):001:0> File.realpath('nonexistent.file')
Errno::ENOENT: No such file or directory - H:/nonexistent.file
        from (irb):1:in `realpath'
        from (irb):1
        from C:/Ruby193/bin/irb:12:in `<main>'

irb(main):002:0> File.realdirpath('nonexistent.file')
=> "H:/nonexistent.file"

File.realpath 与 File.absolute_path 有何不同?

我不在 UNIX 系统上对此进行测试,但我的猜测是唯一的区别是路径何时开始波浪号(即 ~)。在 UNIX 中,波浪号表示主目录。我认为这两种方法之间的区别在于它是否扩展了主目录。

如果您在 Windows 上,那应该没关系(即没有主目录快捷方式)。

realdirpath(pathname) 与 realdirpath(pathname [, dir_string]) 有何不同?

ruby-doc 声明“如果给出了 dir_string,它将用作解释相对路径名而不是当前目录的基本目录。” 换句话说,可以指定 dir_string 来覆盖起点。

例如,让我们假设:

  1. 您正在从 H: 驱动器的根目录运行 irb(即这是您的当前目录)
  2. 您有一个名为“文件夹”的子文件夹(即 H:\Folder)

然后就可以看出区别了:

H:\>irb
irb(main):001:0> File.realdirpath('test.txt')
=> "H:/test.txt"

irb(main):002:0> File.realdirpath('test.txt', './Expense')
=> "H:/Expense/test.txt"

您可以看到第二条语句相对于 dir_string 中所述的目录定位文件。

absolute_path(file_nam) 与 absolute_path(file_name[, dir_string] ) 有何不同?

这与上一个问题相同。

于 2013-01-29T17:56:40.260 回答
2

这不是要回答您的问题,而是要帮助您在 Windows 机器上使用 Ruby、Perl 和可能的 Python 等语言时保持理智。

不要浪费时间使用反斜杠编写路径。相反,加入 *nix 类型的操作系统并在代码中使用正斜杠。这将使将文件从桌面环境移动到网络/托管环境变得更加容易,因为互联网和企业上的大铁通常是 *nix 系统。

IO 文档说:

如果可能,Ruby 将在不同的操作系统约定之间转换路径名。例如,在 Windows 系统上,文件名“/gumby/ruby/test.rb”将打开为“\gumby\ruby\test.rb”。在 Ruby 字符串中指定 Windows 样式的文件名时,请记住转义反斜杠:

"c:\\gumby\\ruby\\test.rb"

我们这里的示例将使用 Unix 风格的正斜杠;File::SEPARATOR 可用于获取特定于平台的分隔符。

于 2013-01-28T21:06:04.643 回答