2017-06-21 58 views
1

面临跌破发行eventhough该文件存在的文件夹中。没有这样的文件或目录@ rb_sysopen红宝石

H:\Ruby_test_works>ruby hurrah.rb 
hurrah.rb:7:in `read': No such file or directory @ rb_sysopen - H:/Ruby_ 
test_works/SVNFolders.txt (Errno::ENOENT) 
     from hurrah.rb:7:in `block in <main>' 
     from hurrah.rb:4:in `each_line' 
     from hurrah.rb:4:in `<main>' 

输入文件(input.txt)列以制表符分隔。

10.3.2.021.asd 10.3.2.041.def SVNFolders.txt 
SubversionNotify Subversionweelta post-commit.bat 
Commit message still rake customemail.txt 
mckechney.com yahoo.in ReadMe.txt 

代码:

dir = 'H:/Ruby_test_works' 
file = File.open("#{dir}/input.txt", "r") 

file.each_line do |line| 
    initial, final, file_name = line.split("\t") 
    #puts file_name 
    old_value = File.read("#{dir}/#{file_name}") 

    replace = old_value.gsub(/#{Regexp.escape(initial)}, #{Regexp.escape(final)}/) 
    File.open("#{dir}/#{file_name}", "w") { |fi| fi.puts replace } 

end 

我一直在使用向前和向后斜杠,但没有运气尝试。我错过了什么,不确定。谢谢。

puts file_name给出了下面的值

SVNFolders.txt 
post-commit.bat 
customemail.txt 
ReadMe.txt 
+0

在输入文件中,提到的文件名有空格,就像'SVN Folders.txt'一样,但是在错误中,同样的文件会这样读'SVNFolders.txt ”。你的文件名是否有空格? – Ucpuzz

+0

让我得到这个直...只有一个** **文件中'H:/ Ruby_test_works':'input.txt'。该文件包含四行文本,每行都以另一个文件名结尾。然后尝试打开该文件...但文件**不存在**。这是你的错误信息。没有'H:/ Ruby_test_works/SVNFolders.txt'这样的文件。那么你的问题到底是什么? –

+0

@Ucpuzz:对不起,这是一个复制粘贴问题。文件没有名字空间 – Goku

回答

4

file_name在结尾处包含换行符\n,这将不会打印,但食堂的路径。您可以通过剥离line首先解决这个问题:

initial, final, file_name = line.strip.split("\t") 

调试代码时,要小心puts。引用其documentation揭示了一个丑陋的真相:

将给定的对象写入ios。 在任何尚未以换行符结束的行之后写入换行符。

另一种说法是,它忽略对象末尾的(可能)换行符。这就是为什么你从来没有看到文件名实际上是SVNFolders.txt\n

而不是使用puts,你排除故障时,可以使用p。两者之间的很短的比较是puts调用to_s,并增加了一个新行,而p电话inspect的对象。这里有一些关于不同点的更多细节:http://www.garethrees.co.uk/2013/05/04/p-vs-puts-vs-print-in-ruby/

+0

非常感谢洞察力。对投入和p使用+1。 – Goku

相关问题