混合写入同一文件的file.write和系统调用

时间:2013-07-26 16:19:29

标签: ruby

我有代码调用两个写入文件的系统命令,我需要在这些调用之间添加代码中的其他内容:

File.open('test.txt', 'w') {|f|
  `echo 1 > #{f.path}`
  f.write '2'
  `echo 3 >> #{f.path}`
}

结果文件只包含

2
3

缺少第一行。我确信有一个简单的解决方案,但我找不到它。

2 个答案:

答案 0 :(得分:1)

您正在以“写入”模式打开文件,该模式正在破坏第一个回声。而是使用“追加”模式。另外,你写完“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-newWhat are the Ruby File.open modes and options?

如果删除任何现有文件很重要,第一个echo将隐式处理(因为它是单个>)。或者你可以明确地在ruby中做到这一点:

File.delete('asdf') if File.exists?('asdf')

答案 1 :(得分:0)

回答我自己的问题:

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}`
}