2012-01-04 19 views
17

¿Se puede iterar sobre todos los archivos en un directorio usando boost :: filesystem y BOOST_FOREACH? ProbéIterar todos los archivos en un directorio usando BOOST_FOREACH

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

Este código se compila, ejecuta, pero no produce el resultado deseado.

Respuesta

28

Puede iterar sobre los archivos de un directorio utilizando BOOST_FOREACH así:

#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

Su dirPath es o no una secuencia, ya sea Es secuencia es de tamaño 1.

http://www.boost.org/doc/libs/1_48_0/doc/html/foreach.html

itera BOOST_FOREACH más secuencias. Pero, ¿qué califica como una secuencia, exactamente? Como BOOST_FOREACH está construido sobre Boost.Range, admite automáticamente aquellos tipos que Boost.Range reconoce como secuencias. Específicamente, BOOST_FOREACH funciona con tipos que satisfacen el concepto de rango de pase único. Por ejemplo, podemos utilizar BOOST_FOREACH con:

  • contenedores STL
  • arrays
  • cadenas nulas terminados (char y wchar_t)
  • std :: pair de iteradores

Nota
El soporte para contenedores STL es muy general; todo lo que se parece a un contenedor STL cuenta. Si ha anidado los tipos de iterador y const_iterator y las funciones de miembro begin() y end(), BOOST_FOREACH sabrá automáticamente cómo iterar sobre él. Es de esta manera que boost :: iterator_range <> y boost :: sub_range <> trabajan con BOOST_FOREACH.

+0

¿Alguna sugerencia sobre cómo puedo corregir el código (sigue usando BOOST_FOREACH)? – user763305

+0

Necesita pasar algo que FOREACH puede repetir como una matriz de archivos, por ejemplo. De lo contrario, no use FOREACH. – clyfe

1

Así que supuse que me perdí el tren en este caso, pero yo estaba teniendo un problema similar, incluso después de encontrar el código que teóricamente debería funcionar. El problema es el tipo de datos boost :: filesystem :: path toma el último carácter de una cadena.

Estaba leyendo de un archivo y mi ruta era "c: \ one \ two \ three". Pero cuando lo convertí en un tipo de datos de ruta, la cadena se cambió a "c: \ one \ two \ thre". No tengo idea de qué es eso, pero debido a esto no se encontró la ubicación del archivo y bla, bla, bla. Lo que hice para arreglarlo fue simplemente agregar otro '\' hasta el final. De esa forma elimina el '\' en lugar de la 'e'.

funcionó bien después de eso. Pero como dije antes, no tengo idea de por qué lo hizo. Espero que esto ayude a alguien.

Cuestiones relacionadas