Генерация уникальных имён файлов
Некоторые программы нуждаются в записи временных файлов. Вот обычный способ построения имени такого файла:
(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 (см. Магические имена файлов).
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Unique-File-Names.html