26.9.5 Генерация уникальных имен файлов

Некоторые программы должны записывать временные файлы. Вот обычный способ создания имени для такого файла:

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

Задача make-temp-file состоит в том, чтобы предотвратить попытку двух различных пользователей или двух различных задач использовать одно и то же имя файла.

Функция: 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 вставляет ее в файл.

Чтобы предотвратить конфликты между различными библиотеками, работающими в одном Emacs, каждая программа Lisp, использующая make-temp-file, должна иметь свой собственный prefix. Число, добавляемое в конец prefix, различает одну и ту же программу, работающую в разных задачах Emacs. Дополнительные добавленные символы позволяют большое количество различных имен даже в одной задаче Emacs.

Директория по умолчанию для временных файлов контролируется переменной temporary-file-directory. Эта переменная предоставляет пользователю единый способ указания директории для всех временных файлов. Некоторые программы используют вместо этого small-temporary-file-directory, если оно не равно nil. Чтобы использовать его, вы должны расширить префикс относительно соответствующей директории перед вызовом make-temp-file.

Пользовательский вариант: temporary-file-directory

Эта переменная указывает имя директории для создания временных файлов. Ее значение должно быть именем директории (см. Имена директорий), но для программ Lisp хорошо, если значение будет именем файла директории. Использование значения в качестве второго аргумента для expand-file-name — хороший способ это сделать.

Значение по умолчанию определяется разумным образом для вашей операционной системы; оно основано на переменных окружения TMPDIR, TMP и TEMP, с резервным вариантом в виде зависимого от системы имени, если ни одна из этих переменных не определена.

Даже если вы не используете make-temp-file для создания временного файла, вы должны использовать эту переменную, чтобы решить, в какой директории поместить файл. Однако, если вы ожидаете, что файл будет маленьким, вы должны сначала использовать small-temporary-file-directory, если оно не равно 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 и созданием файла, что в некоторых случаях может привести к уязвимости безопасности.

Иногда необходимо создать временный файл на удаленном хосте или смонтированной директории. Следующие две функции поддерживают это.

Функция: 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 (см. Обеспечение "магических" имен файлов).