Class: MCMD::Mtemp

Inherits:
Object
  • Object
show all
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

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

#pathObject

一時ファイルの出力パスの取得

返値: 一時ファイルを出力パス名(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

#rmObject

system “rm -rf ##path/_MTEMP#@pid_#@oid_*”



222
223
224
# File 'lib/nysol/mtemp.rb', line 222

def rm
	delAllFiles(@path,@pid,@oid)
end