Ruby脚本启动编辑器修改临时文件后无法读取新内容的问题
问题分析与解决方案
你遇到的这个问题其实挺常见的,根源在于Vim(以及大多数常见编辑器)的文件编辑机制:它们并不会直接在原文件的内容上修改,而是会创建一个临时文件进行编辑,等你保存退出后,用这个新的临时文件替换掉原来的文件。
这就导致你一开始通过Tempfile获取的文件句柄f,指向的是编辑前的旧文件(文件的inode已经发生了变化),所以哪怕你调用f.read,读到的还是最初写入的内容。
修复后的代码方案
最可靠的解决方式是:关闭原来的文件句柄,然后重新打开临时文件的路径来读取修改后的内容。修改后的代码如下:
require 'tempfile' STARTING_TEXT = <<~STR Blah blah blah blah balh blah STR Tempfile.create do |f| f.write(STARTING_TEXT) f.flush # 确保内容写入磁盘 f.close # 关闭原文件句柄,避免持有旧文件引用 # 调用编辑器编辑文件 system("vim #{f.path}") # 重新打开文件,读取修改后的内容 File.open(f.path, 'r') do |updated_f| puts updated_f.read end end
额外说明
- 你之前写的
f.rewind()其实没必要,因为我们之后会关闭文件再重新打开,重新打开的文件指针默认就在开头。 - 这个方案不仅适用于Vim,像Nano、Sublime Text这类编辑器也都采用类似的文件替换机制,所以代码同样适用。
内容的提问来源于stack exchange,提问作者Sean Mackesey
相关产品推荐
相关产品推荐

