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

Чтобы предотвратить конфликты между различными библиотеками, работающими в одном 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

Spec-Zone.ru

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