Spec-Zone.ru › Elisp

Создание уникальных имён файлов

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

(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 вставляет её в файл.

В системах Posix Emacs создаёт файл с разрешениями, ограничивающими доступ к нему текущим пользователем.

Чтобы избежать конфликтов между разными библиотеками, работающими в одном 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-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Unique-File-Names.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API