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