Подтвердить что ты не робот

С++: получение временного файла, кросс-платформенный

Я ищу кросс-платформенный способ получения назначенного временного файла. Например, в linux, который был бы в директории /tmp и в Windows в некотором дерьмовом имени temp dir. Internet Explorer.

Существует ли для этого кросс-платформенное (Boost?) решение?

ИЗМЕНИТЬ

Мне нужно, чтобы этот файл существовал до тех пор, пока программа не завершится. tmpfile() не гарантирует этого. Цитата из ccpreference:

Созданный временный файл автоматически удаляется при закрытии потока (fclose) или при нормальной работе программы.

4b9b3361

Ответ 1

Для создания временного имени файла можно использовать библиотеку Boost Filesystem, начиная с версии 3 этой библиотеки. Он также предлагает четкое решение. Действительно, следующий код на С++ должен быть независимым от платформы:

// Boost.Filesystem VERSION 3 required
#include <string>
#include <boost/filesystem.hpp>
boost::filesystem::path temp = boost::filesystem::unique_path();
const std::string tempstr    = temp.native();  // optional

Объект пути файловой системы temp может использоваться для открытия файла или создания подкаталога, тогда как строковый объект tempstr предлагает ту же информацию, что и строка. Подробнее см. http://www.boost.org.

Ответ 2

Если вы используете Qt: QTemporaryFile класс идеален.

Ответ 3

Стандартная библиотека C содержит функцию с именем tmpfile, она, вероятно, делает то, что вам нужно: http://www.cplusplus.com/reference/clibrary/cstdio/tmpfile/

Вы также можете использовать его в программах на С++.

ИЗМЕНИТЬ:
Если вам нужно только имя файла, вы можете использовать tmpnam, он не удаляет файл при вызове fclose. Он возвращает полный путь к файлу, включая каталог temp.

Путь C:

const char *name = tmpnam(NULL);  // Get temp name
FILE *fp = fopen(name, "w");  // Create the file
// ...
fclose(fp);
remove(name);

Ответ 4

Вы можете использовать функцию стандартной библиотеки C tmpfile.

Ответ 5

Редактировать: Особенно, поскольку вам, кажется, нравится идея Boost, ответ Робби Моррисона, вероятно, лучше для вас.

Мой оригинальный ответ остается ниже, но любой, кто читает это: пожалуйста, остерегайтесь, что tmpnam небезопасен. Кроме того, некоторые платформы (например, Windows) могут иметь неработающие, ошибочные, мозговые или даже отсутствующие реализации.


Как насчет tmpnam, если вам не нравится tmpfile?

По ссылке:

Файл, созданный таким образом, в отличие от файлов, созданных с помощью tmpfile, не удаляется автоматически при закрытии; Вы должны вызвать remove, чтобы удалить этот файл после закрытия.

Особенно, если вам нужна другая программа, чтобы узнать имя файла, это кажется более подходящим, поскольку tmpfile вообще не дает вам имя.

Я считаю, что это не так безопасно, хотя, если это беспокоит. Вот ссылка, описывающая некоторые из этих проблем.


Кроме того: даже если вы хотите использовать tmpfile, вам следует подумать о более безопасных tmpfile_s (документы MS даже заходят так далеко, что называют tmpfile "устаревшим", хотя я сомневаюсь, что он будет удален из стандарта C++ в ближайшее время). Независимо от того, ни один из тех не сохраняет именованный файл, который вам требуется.

Ответ 6

Есть гораздо лучшие способы общения между программами, чем случайные временные файлы. Не могли бы вы использовать трубку для связи? Как насчет использования сокета localhost?

Если вы настаиваете на использовании файлов, просто попросите свою программу использовать имя, возможно, на основе времени запуска.