gpt4 book ai didi

Ruby 无法打开文件 ( Errno::ENOENT ) 但可以从 IRB 打开相同的路径

转载 作者:数据小太阳 更新时间:2023-10-29 07:52:58 24 4
gpt4 key购买 nike

我有一个简单的 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 { |线 | print line 显示文件的完整内容。那么,为什么我可以通过直接命令行请求而不是通过我的 Ruby 类来执行此操作?它是否试图读取本地路径而不是我传递给它的完整路径?

最佳答案

else block 保护 File.open .. 行:

 if (! File.exists? @path)
print "File does not exist!"
else # <---
File.open( @path ).each do |line|
@content << line
end
end # <----

或者在 if block 中返回:

 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.js\r 是导致问题的原因。一个简单的 @path.strip! 解决了这个问题。

关于Ruby 无法打开文件 ( Errno::ENOENT ) 但可以从 IRB 打开相同的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19863770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com