Ruby说文件不存在

时间:2014-04-15 18:37:28

标签: ruby macos file file-io

我是Ruby的新手,我正在编写一个测试程序,只是为了让一些功能失效。这是程序

#!/usr/bin/env ruby

class FileManager
  def read_file(filename)
    return nil unless File.exist?(filename)
    File.read(filename)
  end
end

if __FILE__ == $0
  fm = FileManager.new
  puts "What file would you like to open?"
  fname = gets

  puts fm.read_file fname
end

如您所见,它非常简单。如果我评论read_file方法的第一行,我会收到此错误

No such file or directory - /Users/macuser/Projects/Aptana\ Studio\ 3\ Workspace/Ruby\ Test/text (Errno::ENOENT)
from /Users/macuser/Projects/Aptana Studio 3 Workspace/Ruby Test/ruby.rb:6:in `read_file'
from /Users/macuser/Projects/Aptana Studio 3 Workspace/Ruby Test/ruby.rb:15:in `<main>'

当我运行程序并使用此文件时:/Users/macuser/Projects/Aptana\ Studio\ 3\ Workspace/Ruby\ Test/text

但是,如果我运行cat /Users/macuser/Projects/Aptana\ Studio\ 3\ Workspace/Ruby\ Test/text,它就会输出Hello, world!

我不相信这是一个权限问题,因为我拥有该文件夹,但以防万一我尝试以root身份运行该程序。另外,我确保fname是文件的实际名称,而不是nil。我已经尝试了路径的转义和非转义版本,以及text或完整路径。我知道文件存在的事实,为什么Ruby会给我这个错误?

2 个答案:

答案 0 :(得分:2)

使用gets filename文件名包含换行符\n

您必须在文件名中删除它:

gets filename 
p filename        #"test.rb\n"
p File.exist?(filename) #false
p File.exist?(filename.chomp) #true

(而且你不需要掩盖空格)

答案 1 :(得分:0)

即使gets未通过shell,您似乎还在shell中转义空间。您想要输入&#34; / Users / macuser / Projects / Aptana Studio 3工作区/ Ruby测试/文本&#34;代替&#34; / Users / macuser / Projects / Aptana \ Studio \ 3 \ Workspace / Ruby \ Test / text&#34;。