Class: MCMD::Mtemp
- Inherits:
-
Object
- Object
- MCMD::Mtemp
- Defined in:
- lib/nysol/mtemp.rb
Overview
一時ファイル名を扱うクラス
一時ファイル名の生成と、そのファイルの(自動)削除を行うクラス*。
一時ファイル名はfileもしくはpipeメソッドを呼び出すたびに重複なく生成される。
fileメソッドでは、ファイル名が生成するだけで、実ファイルは生成されない。
一方でpipeメソッドでは、mkfifoコマンドにより名前付きパイプファイルが生成される。
一時ファイル名の命名規則は以下の通り。
"#{@path}/__MTEMP_#{@pid}_#{@oid}_#{@seq}"
@pid : プロセスID ($$)
@oid : オブジェクトID (self.object_id)
@seq : オブジェクト内の通し番号 (自動採番で1から始まる)
@path : 以下の優先順位で決まる。
1) Mtemp.newの第1引数で指定された値*
2) KG_TmpPath環境変数の値
3) TMP環境変数の値
4) TEMP環境変数の値
5) "/tmp"
6) "." (カレントパス)
注*) new第1引数でパス名を明示的に指定した場合、GC時に自動削除されない。
メソッド:
file : 一時ファイル名を返すpath : 一時ファイル名を格納するパスを返すrm : 実行時点までに生成した一時ファイルを全て削除する。
例1
基本利用例
require 'mtools'
tmp=MCMD::Mtemp.new
fName1=tmp.file
fName2=tmp.file
fName3=tmp.file("./xxa")
puts fName1 # -> /tmp/__MTEMP_60637_2152301760_0
puts fName2 # -> /tmp/__MTEMP_60637_2152301760_1
puts fName3 # -> ./xxa
File.open(fName1,"w"){|fp| fp.puts "temp1"}
File.open(fName2,"w"){|fp| fp.puts "temp2"}
File.open(fName3,"w"){|fp| fp.puts "temp3"}
# tmpがローカルのスコープを外れると
# GCが発動するタイミングで一時ファイルも自動的に削除される。
# ただし、fName3は一時ファイル名を直接指定しているの削除されない。
例2:
全ての一時ファイルが自動削除されない例
require 'mtools'
# コンストラクタでパスを指定すると自動削除されない。
# (rmメソッドにより削除することはできる。)
tmp=MCMD::Mtemp.new(".")
fName=tmp.file
File.open(fName,"w"){|fp| fp.puts "temp"}
# tmpがローカルのスコープを外れGCが発動しても
# 一時ファイルは削除されない。
例3:
名前付きパイプ名の生成
require 'mtools'
tmp=MCMD::Mtemp.new
pName=tmp.pipe
system("ls -l #{pName}") # この段階で名前付きパイプファイルが作成されている。
-> prw-r–r– 1 user group 0 7 19 12:20 /tmp/__MTEMP_60903_2152299720_0
system("echo 'abc' > #{pName} &") # バックグラウンド実行でnamed pipeに書き込み
system("cat <#{pName} &") # バックグラウンド実行でnamed pipeから読み込み
# tmpがローカルのスコープを外れると
# GCが発動するタイミングで全ての一時ファイルは自動削除される。
Class Method Summary collapse
Instance Method Summary collapse
-
#file(name = nil) ⇒ Object
一時ファイル名の取得 返値: 一時ファイル名(String).
-
#forceDel(save = false) ⇒ Object
ワークファイル強制削除##path.
-
#path ⇒ Object
一時ファイルの出力パスの取得 返値: 一時ファイルを出力パス名(String).
-
#pipe(name = nil) ⇒ Object
一時ファイル名(名前付きパイプ)の取得 返値: 一時ファイル名(String).
-
#rm ⇒ Object
system “rm -rf ##path/_MTEMP#@pid_#@oid_*”.
Class Method Details
.callback(path, pid, oid) ⇒ Object
115 116 117 118 119 |
# File 'lib/nysol/mtemp.rb', line 115 def callback(path,pid,oid) lambda { delAllFiles(path,pid,oid) } end |
Instance Method Details
#file(name = nil) ⇒ Object
一時ファイル名の取得
返値: 一時ファイル名(String)
以下のフォーマットで一時ファイル名を生成する。@seqはカウントアップされる。フォーマット: “#@path/_MTEMP#@pid_#@oid_#@seq” nameが指定されれば(@path以外に)GCで削除しなくなる。
178 179 180 181 182 183 184 185 186 187 188 |
# File 'lib/nysol/mtemp.rb', line 178 def file(name=nil) # ファイル名の生成 n=nil if name==nil then n="#{mkname}" @seq += 1 else n=name end return n end |
#forceDel(save = false) ⇒ Object
ワークファイル強制削除##path
227 228 229 230 231 232 233 234 |
# File 'lib/nysol/mtemp.rb', line 227 def forceDel(save=false) Dir["#{@path}/__MTEMP_*"].each{|fn| if save then system("tar cvfzP #{fn}.tar.gz #{fn}") end system "rm -rf #{fn}" } end |
#path ⇒ Object
一時ファイルの出力パスの取得
返値: 一時ファイルを出力パス名(String)
215 216 217 |
# File 'lib/nysol/mtemp.rb', line 215 def path return @path end |
#pipe(name = nil) ⇒ Object
一時ファイル名(名前付きパイプ)の取得
返値: 一時ファイル名(String)
以下のフォーマットで名前付きパイプの一時ファイル名を生成する。@seqはカウントアップされる。フォーマット: “#@path/_MTEMP#@pid_#@oid_#@seq” nameが指定されれば(@path以外に)GCで削除しなくなる。
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 |
# File 'lib/nysol/mtemp.rb', line 197 def pipe(name=nil) # ファイル名の生成 n=nil if name==nil then n="#{mkname}" @seq += 1 else n=name end # fifoファイル(名前付きパイプ)の作成 system "mkfifo #{n}" return n end |
#rm ⇒ Object
system “rm -rf ##path/_MTEMP#@pid_#@oid_*”
222 223 224 |
# File 'lib/nysol/mtemp.rb', line 222 def rm delAllFiles(@path,@pid,@oid) end |