2012-01-04 4 views
17

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

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

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

ответ

28

Вы можете перебирать файлы в каталоге с помощью 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 
    } 
} 
0

Ваш 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 контейнеров
  • массивы
  • нуль-терминатором строки (символьные и wchar_t)
  • станд :: пара итераторы

Примечание
Поддержка контейнеров STL очень общая; все, что похоже на контейнер STL. Если у него есть вложенные типы итератора и const_iterator, а также функции begin() и end(), BOOST_FOREACH автоматически узнает, как перебирать его. Таким образом, boost :: iterator_range <> и boost :: sub_range <> работает с BOOST_FOREACH.

+0

Любые предложения, как я могу исправить код (все еще используя BOOST_FOREACH)? – user763305

+0

Вам нужно передать что-то, что FOREACH может выполнять итерацию, например массив массивов. В противном случае не используйте FOREACH. – clyfe

1

Так что я догадался, что я пропустил лодку на этом, но у меня был подобный вопрос даже после того, как я нашел код, теоретически должен работать. Проблема заключается в том, что файл boost :: filesystem :: path передает последний символ из строки.

Я читал из файла, и мой путь был «c: \ one \ two \ three». Но когда я сделал его типом данных пути, строка была изменена на «c: \ one \ two \ thre». Не знаю, что это такое, но из-за этого местоположение файла не было найдено и бла-бла-бла. То, что я сделал, чтобы исправить это, просто добавило еще один «\» до конца. Таким образом, он удаляет «\» вместо «e».

работал просто отлично после этого. Но, как было сказано ранее, я понятия не имею, почему это было сделано. Надеюсь, это поможет кому-то.