与Ruby File类相关的PATH方法混淆

时间:2013-01-28 18:52:16

标签: ruby ruby-1.9.3

我对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.realpathFile.absolute_path的区别?
  3. absolute_path(file_nam)absolute_path(file_name[, dir_string] )的区别如何?
  4. realdirpath(pathname)realdirpath(pathname [, dir_string])的区别如何?

2 个答案:

答案 0 :(得分:3)

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

根据ruby-doc,这两种方法的唯一区别在于路径名的最后一个组件是否必须存在。 realdirpath并不关心,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(路径名)与realdirpath(路径名[,dir_string])有何不同?

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

例如,我们假设:

  1. 您正在从H:驱动器的根目录运行irb(即这是您当前的目录)
  2. 您有一个名为'Folder'的子文件夹(即H:\ Folder)
  3. 然后你可以看到差异:

    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])有何不同?

    这与上一个问题相同。

答案 1 :(得分:2)

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

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

IO documentation说:

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

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

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