如何在Ruby中读取脚本目录外的文件?附目录结构及报错说明
解决Ruby读取上级目录文件时的" No such file or directory "错误
首先先明确你的目录结构:
├── script │ ├── search.rb │ └── searchable.txt └── unsearchable.txt
这个问题我之前也踩过坑,核心原因是Ruby脚本的当前工作目录和目标文件的实际位置不匹配:当你在script目录下运行search.rb时,Ruby默认会把script当作当前工作目录,这时你直接写File.read("unsearchable.txt"),它会去script文件夹里找这个文件——但目标文件明明在script的上级目录,自然会报找不到的错误。
下面给你几种靠谱的解决方法:
方法1:用脚本路径定位(最推荐,不受运行位置影响)
这种方法不管你在哪个目录下运行脚本,都能精准找到目标文件,是最稳妥的写法。
在search.rb里这样写:
# 获取当前脚本所在的目录路径 script_directory = File.dirname(__FILE__) # 拼接上级目录的unsearchable.txt路径 target_file_path = File.join(script_directory, "../unsearchable.txt") # 读取文件内容 file_content = File.read(target_file_path)
或者更简洁的一行写法:
file_content = File.read(File.expand_path("../unsearchable.txt", __FILE__))
这里的__FILE__是Ruby的内置常量,代表当前脚本的完整路径;File.expand_path会把相对路径转换成绝对路径,彻底避免路径混乱的问题。
方法2:先切换工作目录
如果你需要读取多个上级目录的文件,可以先把工作目录切换到脚本所在的script文件夹,之后直接用相对路径访问上级文件:
# 切换工作目录到当前脚本所在的目录 Dir.chdir(File.dirname(__FILE__)) # 现在直接用../就能指向上级目录的文件 file_content = File.read("../unsearchable.txt")
方法3:从根目录运行脚本(不推荐,灵活性差)
如果你不想修改脚本,也可以在终端里从项目的根目录运行search.rb:
ruby script/search.rb
这时当前工作目录是根目录,你在脚本里直接写File.read("unsearchable.txt")就能读到文件,但这种方法限制了你必须在特定目录下运行脚本,不够灵活,所以一般不推荐。
内容的提问来源于stack exchange,提问作者ader
相关产品推荐
相关产品推荐

