我有调用两个写入文件的系统命令的代码,我需要在这些调用之间从我的代码中添加其他内容:
File.open('test.txt', 'w') {|f|
`echo 1 > #{f.path}`
f.write '2'
`echo 3 >> #{f.path}`
}
结果文件只包含
2
3
缺少第一行。我确信有一个简单的解决方案,但我找不到它。
我有调用两个写入文件的系统命令的代码,我需要在这些调用之间从我的代码中添加其他内容:
File.open('test.txt', 'w') {|f|
`echo 1 > #{f.path}`
f.write '2'
`echo 3 >> #{f.path}`
}
结果文件只包含
2
3
缺少第一行。我确信有一个简单的解决方案,但我找不到它。
您正在以“写入”模式打开文件,这会破坏第一个回声。而是使用“附加”模式。此外,你写“2”后不会刷新,所以当你读回来时它会出现故障。请记住, f.write 不会附加换行符,因此您可能也需要它。
irb(main):020:0> File.open('asdf', 'a') do |f|
irb(main):021:1* `echo 1 > asdf`
irb(main):022:1> f.write("2\n") and f.flush
irb(main):023:1> `echo 3 >> asdf`
irb(main):024:1> end
=> ""
irb(main):025:0> File.read('asdf')
=> "1\n2\n3\n"
irb(main):026:0> puts File.read('asdf')
1
2
3
File.open(name, 'a')
是重要的部分。这意味着追加到这个文件而不是覆盖它。请参阅http://www.ruby-doc.org/core-2.0/IO.html#method-c-new和Ruby File.open 模式和选项是什么?有关文件打开模式的说明。
如果删除任何现有文件很重要,则第一个回显将隐式处理(因为它是单个 >)。或者你可以在 ruby 中明确地做到这一点:
File.delete('asdf') if File.exists?('asdf')
回答我自己的问题:
File.open('test.txt', 'w') {|f|
`echo 11 > #{f.path}`
f.seek(0, IO::SEEK_END)
f.write "2\n"
f.flush
`echo 33 >> #{f.path}`
}