Перебирать все файлы в каталоге, используя BOOST_FOREACH - PullRequest
18 голосов
/ 04 января 2012

Можете ли вы перебрать все файлы в каталоге, используя boost :: filesystem и BOOST_FOREACH? Я пытался

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

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

Ответы [ 3 ]

30 голосов
/ 04 января 2012

Вы можете перебирать файлы в каталоге, используя 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
    } 
}
1 голос
/ 07 июля 2017

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

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

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

0 голосов
/ 04 января 2012

Ваш 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 работает с типами, которые соответствуют концепции однопроходного диапазона. Например, мы можем использовать BOOST_FOREACH с:

  • STL контейнеры
  • Массивы
  • Строки с нулевым символом в конце (char и wchar_t)
  • std :: пара итераторов

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

...