2012年12月4日火曜日

ruby update file

rubyでファイルを更新する場合

少し悩んだのでメモ。
テンポラリファイルを作って上書きをする手法

require 'tempfile'

orignal_file = '/var/tmp/original'
# オリジナルファイルのstatを取得
orignal_file_stat = File::stat(orignal_file)

basename = "sample"
# tempファイル作成
temp_file = Tempfile.new(basename, "/dev/shm")
# tempファイルのmode変更(デフォルト 0600)
File::chmod(orignal_file_stat.mode, temp_file.path)
# コンテンツ書き込み
temp_file.puts "contents"
# bufferを吐き出す
temp_file.flush
# diskへ書き込む
temp_file.fsync
# 移動(closeの前に移動する)
FileUtils.mv(temp_file.path, orignal_file)
# 閉じる(移動前に閉じるとGCで消される可能性有)
temp_file.close

0 件のコメント:

コメントを投稿