Важную часть примера 10.12 составляет функция remove
. При ее вызове следует задавать достоверный путь в аргументе path
, который ссылается на файл или пустой каталог, и они будут удалены. Пояснения по классу path
и функции complete
(оба они входят в библиотеку Boost Filesystem) приводятся при обсуждении рецепта 10.7. См. рецепт 10.11, где показан пример удаления каталога и всех содержащихся в нем файлов.
Переименование файла и каталога выполняется аналогично. Замените программный код в блоке try
примера 10.12 следующим кодом.
path src = complete(path(argv[1], native));
path dst = complete(path(argv[2], native));
rename(src, dst);
В результате src
будет переименован в dst
при условии, что оба они содержат достоверные пути, src
и dst
не обязаны иметь общий каталог, и в этом смысле функция переименования фактически перемещает файл или каталог в новый базовый каталог при условии, что путь dst
существует.
Рецепт 10.7.
10.9. Создание временного имени файла и временного файла
Требуется временно сохранить на диске некоторые данные, и вам не хочется писать самому программу, которая генерирует уникальные имена.
Используйте функцию tmpfile
или tmpnam
, которые объявлены в
. tmpfile
возвращает FILE*
, который уже открыт на запись, a tmpnam
генерирует уникальное имя файла, которое вы можете сами открыть. Пример 10.13 показывает, как можно использовать функцию tmpfile
.
#include
#include
int main() {
FILE* pf = NULL;
char buf[256];
pf = tmpfile(); // Создать и открыть временный файл
if (pf) {
fputs("This is a temp file", pf); // Записать в него некоторые данные
}
fseek(pf, 5, SEEK_SET); // Восстановить позицию в файле
fgets(buf, 255, pf); // Считать оттуда строку
fclose(pf);
std:cout << buf << '\n';
}
Создать временный файл можно двумя способами; в примере 10.13 показан один из них. Функция tmpfile
объявляется в
; она не имеет параметров и возвращает FILE*
при успешном завершении и NULL
в противном случае. FILE*
— это тот же самый тип, который может использоваться функциями С, обеспечивающими ввод-вывод; fread
, fwrite
, fgets
, puts
и т.д. tmpfile
открывает временный файл в режиме «wb+» — это означает, что вы можете записывать в него или считывать его в двоичном режиме (т.е. при чтении символы никак специально не интерпретируются) После нормального завершения работы программы временный файл, созданный функцией tmpfile
, автоматически удаляется.
Такой подход может как подойти, так и не подойти для вас — все зависит от того, что вы хотите делать. Заметив, что tmpfile
не предоставляет имени файла, вы спросите, как можно передать его другой программе? В этом случае никак; вам потребуется вместо этой функции использовать аналогичную с именем tmpnam
.
tmpnam
на самом деле не создает временный файл, она просто создает уникальное имя файла, которое вы можете использовать при открытии файла, tmpnam
принимает единственный параметр типа char*
и возвращает значение типа char*
. Вы можете передать указатель на буфер символов char
(он должен быть, по крайней мере, не меньше значения макропеременной L_tmpnam
, также определенной в
), куда tmpnam
скопирует имя временного файла и возвратит указатель на тот же самый буфер. Если вы передадите NULL
, tmpfile
возвратит указатель на статический буфер, содержащий это имя файла, что означает его перезапись последующими вызовами tmpnam
. (См. пример 10.14.)
#include
#include
#include
#include
int main() {
char* pFileName = NULL;
pFileName = tmpnam(NULL);
// Здесь другая программа может получить то же самое имя временного
// файла.
if (!pFileName) {
std::cerr << "Couldn't create temp file name.\n";
return(EXIT_FAILURE);
}
std::cout << "The temp file name is: " << pFileName << '\n';
std::ofstream of(pFileName);
if (of) {
of << "Here is some temp data.";
of.close();
}
std::ifstream ifs(pFileName);