テキストファイルの中身を書き換える

排他もかけてテキストフィルの中身を書き換える場合にどうするか。

f = open("test.txt" , "r+")
f.flock(File::LOCK_EX)
body = f.read
body = ・・・・(書き換え)
f.truncate(0)
f.rewind
f.puts body
f.close

ってのが自分で考えた答えだったんだけど

# 上書き
File.open(filepath, "r+") { |f|
f.flock(File::LOCK_EX)
f.rewind
f.write(data)
f.truncate(f.tell)
}

Paulownia.jp

に有るように、先に rewind して書き込んでから、ポインタ位置まで truncate で切り詰める方がよさそう。何かのエラーで write に失敗した場合でも中身が空になることは無いはず。
てことでこんな感じかな。

open("test.txt" , "r+") {|f|
  f.flock(File::LOCK_EX)
  body = f.read
  body = ・・・・(書き換え)
  f.rewind
  f.puts body
  f.truncate(f.tell)
}

w+ で開くと排他を書ける前にファイルが空になっちゃうのでだめなのだ。