GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Unique-File-Names.html ・ emacs-doc.conao3.com

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

プログラムによっては、一時ファイルを作成する必要があります。こうしたファイルの名前を付ける一般的な方法は以下の通りです。

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

make-temp-fileの役割は、2人の異なるユーザーまたは2つの異なるジョブが、全く同じファイル名を使用しようとするのを防ぐことです。

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

この関数は一時ファイルを作成し、そのファイル名を返します。Emacsは、prefix に、Emacsのジョブごとに異なるランダムな文字を付加することで一時ファイル名を生成します。結果として得られるのは、必ず新しく作成されたファイルであり、text が文字列として指定されていればその内容を含み、そうでなければ空となります。MS-DOSでは、この関数は prefix を8+3のファイル名制限に収まるように切り詰めることができます。prefix が相対ファイル名である場合、それは temporary-file-directory を基準として展開されます。

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

make-temp-file が返る時点で、ファイルは作成されており、中身は空です。その時点で、意図した内容をファイルに書き込むべきです。

dir-flag が nil 以外の場合、make-temp-file は空のファイルではなく空のディレクトリを作成します。そのディレクトリのディレクトリ名ではなく、ファイル名を返します。ディレクトリ名 を参照してください。

suffix が nil でない場合、make-temp-file はそれをファイル名の末尾に追加します。

text が文字列の場合、make-temp-file はそれをファイルに挿入します。

Posixシステムでは、Emacsは現在のユーザーにのみアクセスが制限される権限でファイルを作成します。

同一のEmacs内で動作する異なるライブラリ間の競合を防ぐため、make-temp-fileを使用する各Lispプログラムには、それぞれ固有のprefixを持たせる必要があります。prefixの末尾に付加される数値によって、同一アプリケーションが異なるEmacsジョブで動作している場合に区別されます。さらに文字を追加することで、単一のEmacsジョブ内であっても、多数の個別の名称を設定することが可能になります。

The default directory for temporary files is controlled by the variable temporary-file-directory. This variable gives the user a uniform way to specify the directory for all temporary files. Some programs use small-temporary-file-directory instead, if that is non-nil. To use it, you should expand the prefix against the proper directory before calling make-temp-file.

ユーザーオプション: temporary-file-directory

この変数は、一時ファイルを作成する際のディレクトリ名を指定します。値はディレクトリ名(ディレクトリ名を参照)である必要がありますが、値がディレクトリのファイル名であってもLispプログラムは適切に処理できます。値をexpand-file-nameの第2引数として指定するのが、これを実現する有効な方法です。

デフォルト値は、お使いのオペレーティングシステムに合わせて適切な方法で決定されます。これは環境変数 TMPDIR、TMP、TEMP に基づいており、これらの変数がいずれも定義されていない場合は、システム依存の名称が代替として使用されます。

Even if you do not use make-temp-file to create the temporary file, you should still use this variable to decide which directory to put the file in. However, if you expect the file to be small, you should use small-temporary-file-directory first if that is non-nil.

ユーザーオプション: small-temporary-file-directory

この変数は、サイズが小さくなる可能性が高い特定の一時ファイルを作成するためのディレクトリ名を指定します。

サイズが小さくなる見込みの一時ファイルを作成したい場合は、次のようにディレクトリを算出してください。

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

この関数は、一意のファイル名となる可能性のある文字列を生成します。ファイル名は base-name で始まり、その後にいくつかのランダムな文字が付加されますが、これらの文字は Emacs のジョブごとに異なります。これは make-temp-file に似ていますが、(i) 単に名前を構築するだけでファイルは作成しない、(ii) base-name はマジックではない絶対ファイル名であるべきである、(iii) 返されたファイル名がマジックである場合、既存のファイルに名前が付けられる可能性がある、という点が異なります。特定のファイル名を「マジック」にする を参照してください。

警告: ほとんどの場合、この関数は使用せず、代わりに make-temp-file を使用してください!この関数は、make-temp-name の呼び出しとファイルの作成との間で競合状態が発生しやすく、場合によってはセキュリティ上の脆弱性を招く恐れがあります。

リモートホストやマウント済みディレクトリ上に一時ファイルを作成する必要が生じることがあります。以下の2つの関数がこれに対応しています。

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

この関数は make-temp-file と同様ですが、default-directory に可能な限り近い一時ファイルを作成します。 prefix が相対ファイル名であり、default-directory がリモートファイル名であるか、またはマウントされたファイルシステム上にある場合、一時ファイルは関数 temporary-file-directory が返すディレクトリに作成されます。 それ以外の場合は、関数 make-temp-file が使用されます。 prefix、dir-flag および suffix の意味は make-temp-file と同様です。

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

make-nearby-temp-file 経由で一時ファイルを書き込むためのディレクトリ。リモートの default-directory の場合は、そのリモートホスト上の一時ファイル用ディレクトリとなります。そのようなディレクトリが存在しない場合、または default-directory がマウント済みファイルシステム上にある必要がある場合(mounted-file-systems を参照)、この関数は default-directory を返します。リモートでもマウント済みでもない default-directory の場合は、変数 temporary-file-directory の値が返されます。

一時ファイルのファイル名からローカル部分を抽出するには、file-local-name を使用してください(特定のファイル名を「マジック」にするを参照)。