2017-06-21 84 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

相關問題