From: WATANABE Hirofumi Date: 2003-07-24T00:05:44+09:00 Subject: [ruby-dev:20851] Re: [ruby-cvs] ruby/lib: * lib/tmpdir.rb: new library to get temporary directory path, わたなべです。 Yukihiro Matsumoto writes: > |> TMPDIRという定数でなく、tmpdirというメソッドにしましょうか。 > | > |そうですね。それで最初の一回目だけ実行して持っとけばいいのか。 > > それでも良いですし、たいしたコストじゃないんで毎回実行しても > よいです。その方が環境変数が変動した時などに対応できるとか。 その方針で作ってみました。 $SAFE > 0のとき Win32APIが使える場合は$WINDIR/temp そうでないときは/tmp $SAFE == 0のとき $TMPDIR, $TMP, $TEMP, $USERPROFILE, $WINDIR/temp, /tmp を順に書けるかどうか調べる。どれも書けないときは最終的にカ レントディレクトリのフルパスを返す('.'も調べて書けなければ 例外でもいいのかもしれない)。 class Dir @@systmpdir = '/tmp' begin require 'Win32API' max_pathlen = 260 windir = ' '*(max_pathlen+1) begin getdir = Win32API.new('kernel32', 'GetSystemWindowsDirectory', 'PL', 'L') rescue RuntimeError getdir = Win32API.new('kernel32', 'GetSystemDirectory', 'PL', 'L') end getdir.call(windir, windir.size) windir = File.expand_path(windir.rstrip.untaint) temp = File.join(windir, 'temp') @@systmpdir = temp if File.directory?(temp) and File.writable?(temp) rescue LoadError end def Dir::tmpdir tmp = '.' if $SAFE > 0 tmp = @@systmpdir else for dir in [ENV['TMPDIR'], ENV['TMP'], ENV['TEMP'], ENV['USERPROFILE'], @@systmpdir, '/tmp'] if dir and File.directory?(dir) and File.writable?(dir) tmp = dir break end end end File.expand_path(tmp) end end