Итерировать все файлы в каталоге с помощью BOOST_FOREACH
Вы можете перебирать все файлы в каталоге с помощью boost:: filesystem и BOOST_FOREACH?
Я попробовал
path dirPath = ...
int fileCount = 0;
BOOST_FOREACH(const path& filePath, dirPath)
if(is_regular_file(filePath))
++fileCount;
Этот код компилируется, запускается, но не дает желаемого результата.
Ответы
Ответ 1
Вы можете перебирать файлы в каталоге с помощью BOOST_FOREACH
следующим образом:
#include <boost/filesystem.hpp>
#include <boost/foreach.hpp>
namespace fs = boost::filesystem;
fs::path targetDir("/tmp");
fs::directory_iterator it(targetDir), eod;
BOOST_FOREACH(fs::path const &p, std::make_pair(it, eod))
{
if(fs::is_regular_file(p))
{
// do something with p
}
}
Ответ 2
Итак, я догадался, что пропустил лодку на этом, но у меня была аналогичная проблема, даже после того, как я нашел код, который теоретически должен работать. Проблема заключается в том, что тип данных boost:: filesystem:: path переносит последний char на строку.
Я читал из файла, и мой путь был "c:\one\two\three". Но когда я сделал его типом данных пути, строка была изменена на "c:\one\two\thre". Не знаю, что это такое, но из-за этого местоположение файла не было найдено и бла-бла-бла. То, что я сделал, чтобы исправить это, просто добавило еще один "\" до конца. Таким образом, он удаляет "\" вместо "e".
работал отлично после этого. Но, как было сказано ранее, я понятия не имею, почему это было сделано. Надеюсь, это поможет кому-то.
Ответ 3
Ваш dirPath
либо не является последовательностью, либо его последовательность имеет размер 1.
http://www.boost.org/doc/libs/1_48_0/doc/html/foreach.html
BOOST_FOREACH выполняет итерации по последовательностям. Но что точно соответствует последовательности? Поскольку BOOST_FOREACH построен поверх Boost.Range, он автоматически поддерживает те типы, которые Boost.Range распознает как последовательности. В частности, BOOST_FOREACH работает с типами, которые соответствуют концепции Single Pass Range. Например, мы можем использовать BOOST_FOREACH с:
- Контейнеры STL
- массивы
- Строки с нулевым завершением (char и wchar_t)
- std:: пара итераторов
Примечание
Поддержка контейнеров STL очень общая; все, что похоже на контейнер STL. Если у него есть вложенные типы итератора и const_iterator, а также функции begin() и end(), BOOST_FOREACH автоматически узнает, как перебирать его. Таким образом, boost:: iterator_range < > и boost:: sub_range < > работают с BOOST_FOREACH.