【问题标题】:Ruby saying file doesnt existRuby 说文件不存在
【发布时间】:2014-04-15 18:37:27
【问题描述】:

我是 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 会给我这个错误?

【问题讨论】:

    标签: ruby macos file file-io


    【解决方案1】:

    对于gets filename,文件名包含换行符\n

    你必须在你的文件名中删除它:

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

    (而且你不需要屏蔽空格)

    【讨论】:

    • 这就是问题所在。谢谢。
    【解决方案2】:

    即使gets 没有通过外壳,您似乎也在外壳转义您的空间。您要输入“/Users/macuser/Projects/Aptana Studio 3 Workspace/Ruby Test/text”而不是“/Users/macuser/Projects/Aptana\ Studio\ 3\ Workspace/Ruby\ Test/text”。

    【讨论】:

    • 谢谢,但我也尝试过非转义路径。两者似乎都不起作用。
    猜你喜欢
    • 2017-03-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2016-04-20
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多