2016-04-27 30 views
1

我試圖在系統$ EDITOR中打開一個tmpfile,寫入它,然後在輸出中讀取。我可以得到它的工作,但我想知道爲什麼調用file.read返回一個空字符串(當文件確實有內容時)Ruby:從系統進程寫入的文件中讀取

基本上我想知道正確的方式讀取文件一旦寫入。

require 'tempfile' 

file = Tempfile.new("note") 

system("$EDITOR #{file.path}") 

file.rewind 
puts file.read # this puts out an empty string "" .. why? 

puts IO.read(file.path) # this puts out the contents of the file 

是的,我將在確保塊核彈一次使用的文件運行此)

我上紅寶石2.2.2運行此和使用vim。

+0

你使用的是什麼版本的ruby,以及你用什麼編輯器來編輯內容。 –

+0

我評論過 - 你認爲它有什麼不同? –

+0

如果你使用的不是vim,它會有所作爲,因爲對'system'的調用會在編輯器本身之前退出。我的第一個猜測是你在編輯器寫入任何字節之前試圖讀取文件。 我想我已經找到了你的修復方法,請看下面的答案。 –

回答

1

確保您調用文件對象open試圖在閱讀之前:

require 'tempfile' 

file = Tempfile.new("note") 

system("$EDITOR #{file.path}") 

file.open 
puts file.read 
file.close 
file.unlink 

這也將讓你避免在文件調用rewind,因爲你的過程沒有任何寫入字節它在你打開它的時候。

我相信IO.read會一直爲你打開這個文件,這就是它在這種情況下工作的原因。而在類似IO的對象上調用.read並不總是爲您打開文件。

+0

Doh!是的,應該打開它。謝謝! - 我會和osx提供的其他系統編輯一起玩(因爲我希望它至少能夠在主要版本上運行)。謝謝Steven! –

相關問題