path src = complete(path("c:\\windows\\garbage.txt", native));
Многие функции из библиотеки Boost Filesystem будут выбрасывать исключения, если не удовлетворяется некоторое предусловие. Это подробно описано в документации, но хорошим примером является сама функция copy_file. Файл должен существовать перед копированием, поэтому если исходного файла нет, операция не будет завершена успешно и copy_fileвыбросит исключение. Перехватите исключение, как я это сделал в примере 10.10, и вы получите сообщение об ошибке, объясняющее, что произошло.
10.8. Удаление или переименование файла
Проблема
Требуется удалить или переименовать файл и сделать эту операцию переносимой, те. без использования специфичного для конкретной ОС программного интерфейса.
Решение
Это сделают стандартные C-функции removeи rename, определенные в . Пример 10.11 кратко демонстрирует, как это делается.
Пример 10.11. Удаление файла
#include
include
#include
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
cerr << "Error: " << strerror(errno) << endl;
return(EXIT_FAILURE);
} else {
cout << "File '" << argv[1] << "' removed." << endl;
}
}
Обсуждение
Эти системные вызовы легко использовать: просто вызовите любую из двух функций, передав ей имя файла, который требуется удалить или переименовать. Если что-то не получится, будет возвращено ненулевое значение, и errnoбудет иметь номер соответствующей ошибки. Вы можете использовать strerrorили perror(обе функции определены в ) для вывода на печать сообщения об ошибке, зависящего от реализации.
Для переименования файла следует поменять в примере 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
#include
#include
#include
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, которые объявлены в . tmpfileвозвращает FILE*, который уже открыт на запись, a tmpnamгенерирует уникальное имя файла, которое вы можете сами открыть. Пример 10.13 показывает, как можно использовать функцию tmpfile.
Пример 10.13. Создание временного файла
#include
#include
int main() {
FILE* pf = NULL;
char buf[256];
pf = tmpfile(); // Создать и открыть временный файл
if (pf) {
fputs("This is a temp file", pf); // Записать в него некоторые данные
Читать дальше