Подтвердить что ты не робот

Итерировать все файлы в каталоге с помощью BOOST_FOREACH

Вы можете перебирать все файлы в каталоге с помощью boost:: filesystem и BOOST_FOREACH? Я попробовал

path dirPath = ...
int fileCount = 0;
BOOST_FOREACH(const path& filePath, dirPath)
    if(is_regular_file(filePath))
        ++fileCount;

Этот код компилируется, запускается, но не дает желаемого результата.

4b9b3361

Ответ 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.