ポイントはコメントに書いたとおりです。
元のTempfile.new
の代わりにTempfile.create
を、File.rename
の代わりにFileUtils.cp
を使いました。
Tempfile.create
って知らなかった。
open
と違って、付属のブロックを抜けた時、作成した一時ファイルを削除します。
今度からこっち使おう。
require 'tempfile'
require 'fileutils'
def insert path, start_line, data
pid = Process.pid.to_s
Tempfile.create pid, File.dirname(path) do|temp|
File.open(path) do|input|
start_line.times do
if line = input.gets
temp.write line
end
end
temp.puts data
while line = input.gets
temp.write line
end
end
temp.flush
mode = File.stat(path).mode
# File.renameだとpathとtemp.pathのあるファイルシステムが違う場合、うまく行かない。
# どうせTempfile.createメソッドのブロックを出るときにtempは削除されるはずなので、cpする。
FileUtils.cp(temp.path, path)
File.chmod(mode, path)
end
end
insert ARGV[0], ARGV[1].to_i, ARGV[2]