Errno::ENOENT: No such file or directory
即使文件存在,以下操作也会失败:
open('~/some_file')
但是,我可以这样做:
open(File.expand_path('~/some_file'))
我有两个问题:
- 为什么不
open
将波浪号指向主目录? - 有没有一个比它更好的方式
File.expand_path
?
Answers:
$HOME
只是一个惯例。确实,如果您查看的文档File.expand_path
,它可以正确解释波浪号,但这是函数本身的功能,而不是基础系统固有的功能。此外,还File.expand_path
需要$HOME
正确设置环境变量。这使我们找到了可能的替代方案...试试这个:
open(ENV['HOME']+'/some_file')
我希望它足够光滑。我个人认为使用环境变量在语义上比使用更加清晰expand_path
。
File.join(ENV['HOME'], '/some_file')
它即可在两种情况下均起作用。
不确定在Ruby 1.9.3之前是否可用,但是我发现最优雅的解决方案是使用Dir.home
core的一部分。
open("#{Dir.home}/some_file")
不用依赖$HOME
正确设置环境变量(当您使用共享网络计算机进行开发时可能会很麻烦),您可以使用以下方法从Ruby中获取:
require 'etc'
open ("#{Etc.getpwuid.dir}/some_file")
我相信这可以识别当前登录的用户并获取其主目录,而不是依赖于设置的全局$HOME
环境变量。我认为这是上述解决方案的替代方案。
我发现了波浪号问题,并创建了一个补丁来添加 absolute_path
将波浪号视为普通字符。
从文件文档中:
absolute_path(file_name [, dir_string] ) → abs_file_name
将路径名转换为绝对路径名。除非给出dir_string,否则相对路径是从进程的当前工作目录中引用的,在这种情况下,它将用作起点。如果给定的路径名以“〜”开头,则不会扩展,它将被视为普通目录名。
open(ENV['HOME']+'some_file')