C++. Сборник рецептов - [145]

Шрифт
Интервал

> // Сначала удалить содержимое каталога

> directory_iterator end;

> for (directory_iterator it(p); it != end; ++it) {

>  if (is_directory(*it)) {

>   removeRecurse(*it);

>  } else {

>   remove(*it);

>  }

> }

> // Затем удалить сам каталог

> remove(p);

>}


>int main(int argc, char** argv) {

> if (argc != 2) {

>  cerr << "Usage: " << argv[0] << " [dir name]\n";

>  return(EXIT_FAILURE);

> }

> path thePath = system_complete(path(argv[1], native));

> if (!exists(thePath)) {

>  cerr << "Error: the directory " << thePath.string()

>   << " does not exist.\n";

>  return(EXIT_FAILURE);

> }

> try {

>  removeRecurse(thePath);

> } catch (exception& e) {

>  cerr << e.what() << endl;

>  return(EXIT_FAILURE);

> }

> return(EXIT_SUCCESS);

>}

Программный код, обеспечивающий просмотр содержимого каталога, требует некоторых пояснений, и это является темой рецепта 10.12.

Библиотека Boost Filesystem достаточно удобна, однако следует помнить, что формально она не является стандартом, и поэтому нет гарантии, что она будет работать в любой среде. Если вы посмотрите на исходный код библиотеки Boost Filesystem, вы увидите, что фактически она компилирует системные вызовы, специфичные для целевой платформы. Если вас не волнует переносимость, используйте программный интерфейс файловой системы вашей ОС, который, вполне вероятно, обладает большей гибкостью.

Смотри также

Рецепт 10.12.

10.12. Чтение содержимого каталога

Проблема

Требуется прочитать содержимое каталога, вероятно, для того, чтобы сделать что-то с каждым его файлом или подкаталогом.

Решение

Для получения переносимого решения воспользуйтесь классами и функциями библиотеки Boost Filesystem. Она содержит ряд удобных функций по работе с файлами, обеспечивая переносимое представление путей, итераторы каталога и различные функции по переименованию, удалению и копированию файлов и т.п. Пример 10.19 показывает, как можно использовать некоторые из этих средств.

Пример 10.19. Чтение каталога

>#include

>#include

>#include


>using namespace boost::filesystem;


>int main(int argc, char** argv) {

> if (argc < 2) {

>  std::cerr << "Usage: " << argv[0] << " [dir name]\n";

>  return(EXIT_FAILURE);

> }

> path fullPath = // Создать полный, абсолютный путь

>  system_complete(path(argv[1], native));

> if (!exists(fullPath)) {

>  std::cerr << "Error: the directory " << fullPath.string()

>   << " does not exist.\n";

>  return(EXIT_FAILURE);

> }

> if (!is_directory(fullPath)) {

>  std::cout << fullPath.string() << " is not a directory!\n";

>  return(EXIT_SUCCESS);

> }

> directory_iterator end;

> for (directory_iterator it(fullPath);

>  it != end; ++it) {        // Просматривать в цикле каждый

>                           // элемент каталога почти

>  std::cout << it->leaf(); // так же, как это делалось бы для

>  if (is_directory(*it))   // STL-контейнера

>   std::cout << " (dir)";

>  std::cout << '\n';

> }

> return(EXIT_SUCCESS);

>}

Обсуждение

Как и при создании и удалении каталогов (см. рецепты 10.10 и 10.11), не существует стандартного, переносимого способа чтения содержимого каталога. Чтобы облегчить жизнь в C++, библиотека Filesystem проекта Boost содержит ряд переносимых функций по работе с файлами и каталогами. Она также содержит много других функций; дополнительную информацию вы найдете при описании других рецептов этой главы или на веб-странице библиотеки Boost Filesystem сайта www.boost.com.

В примере 10.19 приводится простая программа просмотра каталога (наподобие команды >ls в Unix или >dir в MS-DOS). Сначала она следующим образом формирует абсолютный путь на основе аргументов, переданных программе.

>path fullPath = complete(path(argv[1], native));

Тип данных переменной, содержащей путь, называется, естественно, >path (путь). С этим типом данных работает файловая система, и он легко преобразуется в строку путем вызова >path::string. После формирования пути программа проверяет его существование (с помощью функции >exists), затем с помощью другой функции, >is_directory, проверяет, задает ли данный путь каталог. Если ответ положителен, то все хорошо и можно перейти к реальной работе по просмотру содержимого каталога.

Файловая система имеет класс с именем >directory_iterator, который использует стандартную семантику итераторов, подобную применяемой для стандартных контейнеров, чтобы можно было использовать итераторы как указатели на элементы каталога. Однако в отличие от стандартных контейнеров здесь нет функции-члена >end, представляющей элемент, следующий за последним элементом (т.е. >vector::end). Вместо этого, если вы создаете итератор каталога >directory_iterator при помощи стандартного конструктора, он предоставляет конечный маркер, который вы можете использовать в операциях сравнения для определения момента завершения просмотра каталога. Поэтому используйте следующий оператор.

>directory_iterator end;

Затем вы можете создать итератор для вашего пути и следующим образом сравнивать его с маркером конца.

>for (directory_iterator it(fullPath); it != end; ++it) {

> // выполнить любые действия с *it

> std::cout << it->leaf();

>}

Функция-член >leaf возвращает строку, представляющую конечный элемент пути, а не весь путь, который вы можете получить, вызывая функцию-член


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


Фундаментальные алгоритмы и структуры данных в Delphi

Книга "Фундаментальные алгоритмы и структуры данных в Delphi" представляет собой уникальное учебное и справочное пособие по наиболее распространенным алгоритмам манипулирования данными, которые зарекомендовали себя как надежные и проверенные многими поколениями программистов. По данным журнала "Delphi Informant" за 2002 год, эта книга была признана сообществом разработчиков прикладных приложений на Delphi как «самая лучшая книга по практическому применению всех версий Delphi».В книге подробно рассматриваются базовые понятия алгоритмов и основополагающие структуры данных, алгоритмы сортировки, поиска, хеширования, синтаксического разбора, сжатия данных, а также многие другие темы, тесно связанные с прикладным программированием.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.


Как пасти котов. Наставление для программистов, руководящих другими программистами

«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.