Многие функции из библиотеки Boost Filesystem будут выбрасывать исключения, если не удовлетворяется некоторое предусловие. Это подробно описано в документации, но хорошим примером является сама функция
copy_file
. Файл должен существовать перед копированием, поэтому если исходного файла нет, операция не будет завершена успешно и
copy_file
выбросит исключение. Перехватите исключение, как я это сделал в примере 10.10, и вы получите сообщение об ошибке, объясняющее, что произошло.
10.8. Удаление или переименование
файла
Проблема
Требуется удалить или переименовать файл и сделать эту операцию переносимой, те. без использования специфичного для конкретной ОС программного интерфейса.
Решение
Это сделают стандартные C-функции
remove
и
rename
, определенные в
<cstdio>
. Пример 10.11 кратко демонстрирует, как это делается.
Пример 10.11. Удаление файла
#include <iostream>
include <cstdio>
#include <cerrno>
using namespace std;
int main(int argc, char** argv) {
if (argc != 2) {
cerr << "You must supply a file name to remove." << endl;
return(EXIT_FAILURE);
}
if (remove(argv[1]) == -1) { // remove возвращает при ошибке -1
Эти системные вызовы легко использовать: просто вызовите любую из двух функций, передав ей имя файла, который требуется удалить или переименовать. Если что-то не получится, будет возвращено ненулевое значение, и
errno
будет иметь номер соответствующей ошибки. Вы можете использовать
strerror
или
perror
(обе функции определены в
<cstdio>
) для вывода на печать сообщения об ошибке, зависящего от реализации.
Для переименования файла следует поменять в примере 10.11 вызов функции
remove
следующим программным кодом.
if (rename(argv[1], argv[2])) {
cerr << "Error: " << strerror(errno) << endl;
return(EXIT_FAILURE);
}
Библиотека Boost Filesystem также предоставляет средства для удаления и переименования файла. В примере 10.12 показана короткая программа по удалению файла (или каталога, однако см. обсуждение, приводимое после этою примера).
Пример 10.12. Удаления файла средствами Boost
#include <iostream>
#include <string>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/fstream.hpp>
using namespace std;
using namespace boost::filesystem;
int main(int argc, char** argv) {
//
Проверить параметры...
try {
path p = complete(path(argv[1], native));
remove(p);
} catch (exception& e) {
cerr << e.what << endl;
}
return(EXIT_SUCCESS);
}
Важную часть примера 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
, которые объявлены в
<cstdio>
.
tmpfile
возвращает
FILE*
, который уже открыт на запись, a
tmpnam
генерирует уникальное имя файла, которое вы можете сами открыть. Пример 10.13 показывает, как можно использовать функцию
tmpfile
.
Пример 10.13. Создание временного файла
#include <iostream>
#include <cstdio>
int main {
FILE* pf = NULL;
char buf[256];
pf = tmpfile; // Создать и открыть временный файл
if (pf) {
fputs("This is a temp file", pf); // Записать в него некоторые данные
}
fseek(pf, 5, SEEK_SET); // Восстановить позицию в файле