Next: , Previous: , Up: File Names   [Contents][Index]


26.9.5 一意なファイル名の生成

一時ファイルに書き込む必要があるプログラムがいくつかあります。以下は、そのようなファイルを構築する便利な方法です:

(make-temp-file name-of-application)

make-temp-fileの役目は、2人の異なるユーザーやジョブが完全に一致する名前のファイルの使用を防ぐことです。

Function: make-temp-file prefix &optional dir-flag suffix text

この関数は一時ファイルを作成して、その名前をリターンする。EmacsはEmacsの各ジョブごとに異なるランダムないくつかの文字をprefixに追加することにより一時ファイルの名前を作成する。結果として文字列としてtextが与えられた場合にはそれを含むファイル、それ以外は空ファイルが新たに作成されることが保障される。MS-DOSでは、8+3のファイル名制限に適合するように、文字列stringが切り詰められる可能性がある。prefixが相対ファイル名ならtemporary-file-directoryにたいして展開される。

(make-temp-file "foo")
     ⇒ "/tmp/foo232J6v"

make-temp-fileがリターンした際には、一時ファイルは空で作成される。この時点でそのファイルに意図するコンテンツを書き込むこと。

dir-flagnilなら、make-temp-fileは空のファイルのかわりに空のディレクトリーを作成する。これはディレクトリー名ではなく、ディレクトリーのファイル名をリターンする。Directory Namesを参照のこと。

suffixが非nilなら、make-temp-fileはそれをファイル名の最後に追加する。

textが文字列ならmake-temp-fileはそれをファイルに挿入する。

同じEmacs内で実行される異なるライブラリー間での競合を防ぐために、make-temp-fileを使用する各Lispプログラムがプログラム自身のprefixを使用すること。prefixの最後に追加される数字は、異なるEmacsジョブ内で実行される同じアプリケーションを区別する。追加される文字により、同一のEmacsジョブ内でも多数の名前を区別することが可能になる。

一時ファイル用のデフォルトディレクトリーは変数temporary-file-directoryにより制御されます。この変数によりすべての一時ファイルにたいして、ユーザーがディレクトリーを指定する一貫した方法が与えられます。small-temporary-file-directoryが非nilなら、かわりにそれを使うプログラムもいくつかあります。これを使う場合には、make-temp-fileを呼び出す前に正しいディレクトリーにたいしてプレフィックスを展開するべきです。

User Option: temporary-file-directory

この変数は一時ファイル作成用のディレクトリー名を指定する。値はディレクトリー名であるべきだが、もし値がディレクトリーのファイル名(Directory Namesを参照)ならば、Lispプログラムがかわりに対処すればよい。expand-file-nameの2つ目の引数としてその値を使用するのは、それを達成するよい方法である。

デフォルト値はオペレーティングシステムにたいして適切な方法により決定される。これは環境変数TMPDIRTMPTEMPにもとづく値で、これらの変数が定義されていなければシステム依存の名前にフォールバックする。

一時ファイルの作成にmake-temp-fileを使用しない場合でも、一時ファイルを置くディレクトリーを判断するために依然としてこの変数を使用するべきである。しかし一時ファイルが小さくなることを求める場合には、small-temporary-file-directoryが非nilならそれを使用すること。

User Option: small-temporary-file-directory

この変数はサイズが小さいと予想される特定の一時ファイル作成用のディレクトリー名を指定する。

小さくなるかもしれない一時ファイルに書き込みたいなら、以下のようにディレクトリーを計算すること:

(make-temp-file
  (expand-file-name prefix
                    (or small-temporary-file-directory
                        temporary-file-directory)))
Function: make-temp-name base-name

この関数は一意なファイル名として使用できる文字列を生成する。この名前はbase-nameで始まり、それに各Emacsジョブごとに異なる複数のランダムな文字を追加したものである。これはmake-temp-fileと似ているが、(i)名前だけを作成してファイルは作成せず、(ii)base-nameはマジックファイル名ではない絶対ファイル名であること、(iii)リターンされるファイル名がマジックファイル名なら既存のファイルかもしれない、という点が異なる(MS-DOSシステムでは8+3ファイル名制限に適合するようにbase-nameが切り詰められる)。

警告: この関数を使用するべきではない。かわりにmake-temp-fileを使用すること! この関数は競合状態の影響を受けやすい。make-temp-name呼び出しと一時ファイル作成のタイムラグはセキュリティーホールとなり得る。

リモートホストやマウントされたディレクトリーで一時ファイルの作成を要する場合があります。以下の2つの関数はそれをサポートします。

Function: make-nearby-temp-file prefix &optional dir-flag suffix

この関数はmake-temp-fileと同様だができ得るかぎりdefault-directoryに近接した一時ファイルを作成する点が異なる。prefixが相対ファイル名でdefault-directoryがリモートファイル名かマウントされたファイルシステムに配置されていれば、一時ファイルは関数temporary-file-directoryがリターンするディレクトリー内に作成される。それ以外なら関数make-temp-fileを使用する。prefixdir-flagsuffixの意味はmake-temp-fileの場合と同様。

(let ((default-directory "/ssh:remotehost:"))
  (make-nearby-temp-file "foo"))
     ⇒ "/ssh:remotehost:/tmp/foo232J6v"
Function: temporary-file-directory

make-nearby-temp-fileを通じて一時ファイルを書き込むディレクトリー。default-directoryがリモートの場合にはリモートホスト上の一時ファイル用のディレクトリー。そのようなディレクトリーが存在しない、またはdefault-directoryがマウントされるファイルシステム上に配置される場合(mounted-file-systemsを参照)には、この関数はdefault-directoryをリターンする。リモートでもマウントされたファイルシステムでもないdefault-directoryではtemporary-file-directoryの値がリターンされる。

一時ファイルのファイル名のローカル部分を抽出するためにはfile-local-nameを使用してください(Magic File Namesを参照)。