Ruby:找不到文件异常,即使它存在,也是循环传递的

时间:2016-05-27 15:34:47

标签: ruby

我在练习Ruby之后,用一个简单的小程序来重新发布Java,这个程序决定了几千个文档的相似程度。我在高中的Java初中为数据结构项目做了同样的事情,并且实际上写了老师见过的最快的程序(显然),但不知怎的,我不能把它转移到Ruby。

我正在尝试创建一个文件数组:

array = Dir.foreach("/home/rj/Documents/Ruby Code/Catching Plaigarists/Large number of documents") do |filename|
    File.new(filename, "r") unless filename.start_with?(".") #Prevents it from returning current and parent directories
end

当我在终端中运行它时,我得到了这个相当恼人的例外:

/home/rj/Documents/Ruby Code/Catching Plaigarists/y_don_it_work.rb:2:in `initialize': No such file or directory @ rb_sysopen - bmu390.shtml.txt (Errno::ENOENT)
    from /home/rj/Documents/Ruby Code/Catching Plaigarists/y_don_it_work.rb:2:in `new'
    from /home/rj/Documents/Ruby Code/Catching Plaigarists/y_don_it_work.rb:2:in `block in <main>'
    from /home/rj/Documents/Ruby Code/Catching Plaigarists/y_don_it_work.rb:1:in `foreach'
    from /home/rj/Documents/Ruby Code/Catching Plaigarists/y_don_it_work.rb:1:in `<main>'

我检查确保文件存在。它做了。再多跑几次。同一文件也是如此。当然,我试图删除该文件。但后来它对其他一些文件做了同样的事情。当我删除该文档时,它设法找到了一些其他文档的问题,其中字母顺序优先级,前两次似乎做得很好。

为什么它不能找到这些文件,如果它们不存在,为什么循环首先传递文件名?我究竟做错了什么?为什么是我?

(此外,我正在使用Cinnamon运行Fedora,如果这会产生任何影响。)

1 个答案:

答案 0 :(得分:1)

您的工作目录与您循环的目录不同。您可以将使用的路径存储为字符串,然后将其连接到从循环中返回的文件名。

path = "/home/rj/Documents/Ruby Code/Catching Plaigarists/Large number of documents/"
array = Dir.foreach(path) do |filename|
  File.new((path + filename), "r") unless filename.start_with?(".")
end

您需要path变量末尾的斜杠来构建正确的路径。