如何打开相对于主目录的文件
以下Errno::ENOENT: No such file or directory
失败Errno::ENOENT: No such file or directory
,即使该文件存在:
open('~/some_file')
不过,我可以这样做:
open(File.expand_path('~/some_file'))
我有两个问题:
- 为什么不
open
指向主目录的代字符? - 有比
File.expand_path
吗?
- shell(bash,zsh等)负责通配符扩展,所以在第一个例子中没有shell,因此没有扩展。 使用代字号指向
$HOME
仅仅是一个惯例; 的确,如果你看看File.expand_path
的文档,它正确地解释了代字号,但它是函数本身的一个特性,而不是底层系统固有的东西。 另外,File.expand_path
需要正确设置$HOME
环境variables。 这使我们有可能select… -
尝试这个:
open(ENV['HOME']+'/some_file')
我希望它光滑。 我个人认为使用环境variables在语义上比使用expand_path
更清晰。
不知道这是否在Ruby 1.9.3之前是可用的,但我发现最优雅的解决scheme是使用Dir.home
,它是核心的一部分。
open("#{Dir.home}/some_file")
而不是依赖$HOME
环境variables被正确设置,当你使用共享networking计算机进行开发时,这可能是一个麻烦,你可以从Ruby使用:
require 'etc' open ("#{Etc.getpwuid.dir}/some_file")
我相信这标识了当前login的用户,并获得他们的主目录,而不是依赖全局的$HOME
环境variables被设置。 这是我认为上述替代解决scheme。
我发现了代字号的问题,并创build了一个补丁来添加absolute_path
,将tilde视为普通字符。
从文件文件:
absolute_path(file_name [, dir_string] ) → abs_file_name
将path名转换为绝对path名。 相对path是从进程的当前工作目录引用的,除非给出了dir_string,在这种情况下,它将被用作起点。 如果给定的path名以“〜”开头,则不会展开,则将其视为正常的目录名称。