Чтение онлайн

на главную - закладки

Жанры

C++. Сборник рецептов

Когсуэлл Джефф

Шрифт:

path src = complete(path("c:\\windows\\garbage.txt", native));

Многие функции из библиотеки 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

cerr << "Error: " << strerror(errno) << endl;

return(EXIT_FAILURE);

 } else {

cout << "File '" << argv[1] << "' removed." << endl;

 }

}

Обсуждение

Эти системные вызовы легко использовать: просто вызовите любую из двух функций, передав ей имя файла, который требуется удалить или переименовать. Если что-то не получится, будет возвращено ненулевое значение, и

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); // Восстановить позицию в файле

Поделиться:
Популярные книги

Хозяин Теней 3

Петров Максим Николаевич
3. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Хозяин Теней 3

Контракт на материнство

Вильде Арина
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Контракт на материнство

На границе империй. Том 10. Часть 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 3

Эволюционер из трущоб

Панарин Антон
1. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб

Идеальный мир для Лекаря 5

Сапфир Олег
5. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 5

Боец с планеты Земля

Тимофеев Владимир
1. Потерявшийся
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Боец с планеты Земля

Бастард Императора. Том 5

Орлов Андрей Юрьевич
5. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 5

Правильный попаданец

Дашко Дмитрий Николаевич
1. Мент
Фантастика:
альтернативная история
5.75
рейтинг книги
Правильный попаданец

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Его огонь горит для меня. Том 2

Муратова Ульяна
2. Мир Карастели
Фантастика:
юмористическая фантастика
5.40
рейтинг книги
Его огонь горит для меня. Том 2

Блуждающие огни 4

Панченко Андрей Алексеевич
4. Блуждающие огни
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Блуждающие огни 4

Жена воина, или любовь на выживание

Звездная Елена
3. Право сильнейшего
Фантастика:
фэнтези
8.98
рейтинг книги
Жена воина, или любовь на выживание

Локки 4 Потомок бога

Решетов Евгений Валерьевич
4. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Локки 4 Потомок бога

Идеальный мир для Лекаря 19

Сапфир Олег
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 19