我有一个简单的 Ruby 脚本,它正在从字符串数组构建文件列表,所以我有一个有点像这样的方法:
def initialize( rootpath, name )
@content = ""
intermission = ""
if ( ! (rootpath[-1] == "/" || name[0] == "/" ))
intermission="/"
end
@path= "#{rootpath}#{intermission}#{name}"
print "Open JavascriptFile from #{@path}"
if (! File.exists? @path)
print "File does not exist!"
end
File.open( @path ).each do |line|
@content << line
end
end
这被称为:
files= ['alice.js', 'bob.js', 'claire.js', 'dave.js']
basepath= "/home/glenatron/projects/myJSProject/"
files.each do |filename|
myLoader.new( basepath, filename )
end
当我从 IRB 加载我的类并运行它时,我得到:
Open JavascriptFile from /home/glenatron/projects/myJSProject/alice.js
File does not exist!
Errno::ENOENT: No such file or directory - /home/glenatron/projects/myJSProject/alice.js
据我了解,这意味着该文件不存在。
然而,不仅文件肯定存在,在IRB中,我可以粘贴完全相同的路径并查看它的内容 - 一个简单的File.open("/home/glenatron/projects/myJSProject/alice.js").each { | line | print line }
揭示了文件的完整内容。那么为什么我可以从直接命令行请求而不是从我的 Ruby 类执行此操作呢?它是否试图读取本地路径而不是我传递它的完整路径?
用else
块保护File.open ..
行:
if (! File.exists? @path)
print "File does not exist!"
else # <---
File.open( @path ).each do |line|
@content << line
end
end # <----
或在if
块的较早位置返回:
if (! File.exists? @path)
print "File does not exist!"
return
endif
否则,代码始终尝试打开文件,即使它不存在也是如此。
使用 File::join
连接路径组件:
File.join("/home/glenatron/projects/myJSProject/", "alice.js")
# => "/home/glenatron/projects/myJSProject/alice.js"
File.join("/home/glenatron/projects/myJSProject", "alice.js")
# => "/home/glenatron/projects/myJSProject/alice.js"
编辑以将解决方案(在注释中)带入答案:要找到确切的路径,请使用 p @path
- 这表明尝试打开的路径在失败时如下所示:/home/glenatron/projects/myJSProject/alice.jsr
导致问题的原因。一旦清楚了这一点,一个简单的@path.strip!
就解决了它。
从问题中显示的代码来看,看起来像一个end
而不是一个else
,例如
if (! File.exists? @path)
print "File does not exist!"
end # <------------ This wasn't valid
File.open( @path ).each do |line|
@content << line
end
end
应该是
if (! File.exists? @path)
print "File does not exist!"
else
File.open( @path ).each do |line|
@content << line
end # THIS end is valid as it ends a `.each` block
end