如果文件存在,则以下Errno::ENOENT: No such file or directory
失败:
open('~/some_file')
但是,我可以这样做:
open(File.expand_path('~/some_file'))
我有两个问题:
open
不会将波形符处理为指向主目录?File.expand_path
更加流畅?答案 0 :(得分:113)
不确定这是否在Ruby 1.9.3之前可用,但我发现最优雅的解决方案是使用Dir.home
作为核心的一部分。
open("#{Dir.home}/some_file")
答案 1 :(得分:101)
$HOME
仅仅是一种惯例;实际上,如果你查看File.expand_path
的文档,它会正确解释波浪号,但它是函数本身的一个特征,而不是底层系统固有的东西;另外,File.expand_path
要求正确设置$HOME
环境变量。这让我们有了可能的替代方案...... 试试这个:
open(ENV['HOME']+'/some_file')
我希望它足够光滑。我个人认为使用环境变量在语义上比使用expand_path
更清晰。
答案 2 :(得分:12)
您可以使用共享网络计算机进行开发,而不是依赖于正确设置的$HOME
环境变量,这可能很麻烦:
require 'etc'
open ("#{Etc.getpwuid.dir}/some_file")
我相信这会识别当前登录用户并获取其主目录,而不是依赖于正在设置的全局$HOME
环境变量。这是我认为的上述替代解决方案。
答案 3 :(得分:2)
我发现了代字号问题,并创建了一个补丁来添加absolute_path
将代字号视为普通字符。
从文档文档:
absolute_path(file_name [, dir_string] ) → abs_file_name
将路径名转换为绝对路径名。除非给出dir_string,否则从进程的当前工作目录引用相对路径,在这种情况下,它将用作起始点。如果给定的路径名以“〜”开头,则不会展开,它将被视为普通目录名。