Программирование на C++: рекурсивный обход каталогов

Использование библиотеки BOOST C++: Boost.Filesystem

 

Хэзфилд Р., Кирби Л.
Искусство программирования на C: Фундаментальные алгоритмы, структуры данных и примеры приложений

Использование библиотеке Boost.Filesystem - один из наиболее простых и правильных (IMHO) путей решения задачи. Недостатками (по сравнению с вызовом функций API Win32 или .NET Framework) может быть отсутствие поддержки UNICODE (впрочем, авторы настаивают на обоснованности такого ограничения - см. FAQ), главным достоинством - работа на разных платформах. Тем не менее, Boost.Filesystem используется как базовый инструмент для локального паука проекта поисковой машины - набора классов, с помощью которых организуется рекурсивный обход каталогов, распаковка архивов и обработка файлов. Паук поисковой машины - это гораздо более мощный механизм для перебора файлов с разными дополнительными условиями, фильтрами и т.д., но по сути его основой является приведенный ниже простой код.

Такой же подход используется в утилите для обработки html-страниц (очистка от мусора) HTML_ZIP.

Проект для C Builder 6.0 (3.5 Kb zip)

Исполнимый файл (124 Kb  zip)

Реализация для MS DOS и Turbo C++ 3.1

Во времена господства недооперационной системы MSDOS реализация такой операции, как рекурсивный обход каталогов, требовал либо вызова системного прерывания 21h MS DOS, либо поиска в документации по конкретному компилятору C функций-оберток (это не стандартизированные C вызовы, поэтому фантазию разработчиков библиотек ничто не останавливало). Для Turbo C++ 3.1 в API были функции _dos_findfirst и _dos_findnext, с помощью которых и решалась задача. Далее приводится пример программы (исходные коды и скомпилированный файл). Следует иметь в виду, что ожидать от данных функций поддержки длинных имен файлов и нормальной работы с национальными символами в именах файлов не стоит.

Проект для Turbo C++ 3.1 (3Кб zip)

Исполнимый файл (11 Кб zip)

Реализация для .NET Framework

Среда .NET предлагает собственные, относительно удобные средства работы с каталогами и файлами. Рекурсивный обход каталогов организуется очень легко - с использованием API функций System::IO::Directory::GetFiles и System::IO::Directory::GetDirectories. Обратите внимание, что (как и весь фреймворк) манипуляции происходят с юникод-именами, поэтому специально заботиться о представлении кириллицы не нужно (для Boost.Filesystem это, напротив, является определенной проблемой).

Проект для MS VisualStudio 2003 (5.6 Kb)

 

Последние изменения 04.06.2005   © Mental Computing 2010