2016-04-27 126 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! –