【问题标题】:Ruby: Reading from a file written to by the system processRuby:从系统进程写入的文件中读取
【发布时间】:2016-08-21 19:59:49
【问题描述】:

我试图在系统 $EDITOR 中打开一个 tmpfile,写入它,然后读入输出。我可以让它工作,但我想知道为什么调用 file.read 返回一个空字符串(当文件确实有内容时)

基本上我想知道文件写入后读取文件的正确方法。

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

是的,我将在一个确保块中运行它以核对使用过的文件;)

我在 ruby​​ 2.2.2 上运行它并使用 vim。

【问题讨论】:

  • 你用的是什么版本的ruby,你用什么编辑器来编辑内容。
  • 我已经评论了 - 你认为它有什么不同?
  • 如果你使用 vim 以外的东西会有所不同,因为对 system 的调用会在编辑器本身之前退出。我的第一个猜测是您试图在编辑器写入任何字节之前读取文件。我想我已经找到了你的解决方法,请在下面查看我的答案。
  • 嗯,我也针对 nano 和 emacs 测试了这个(在 OSX 上),它确实阻塞,直到文件被写入...当我在写入后退出程序 (vim/emacs/nano)文件,脚本显示我想要的结果。
  • 是的,在标准设置中,大多数基于终端的文本编辑器(vim、nano、emacs)将接管整个终端会话,暂停脚本。作为独立应用程序的编辑器(sublime text、BBEdit、atom)将在当前终端会话之外启动,并且一旦启动应用程序,system 调用就会返回。

标签: ruby file io


【解决方案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 并不总是会为您打开文件。

【讨论】:

  • 噢!是的,应该叫open就可以了。谢谢! - 我将与 osx 提供给我的其他系统编辑器一起玩(因为我希望它至少可以在主要的系统编辑器上工作)。谢谢史蒂文!
猜你喜欢
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 2017-11-24
  • 2010-12-01
相关资源
最近更新 更多