2012-01-04 4 views
17

È possibile eseguire l'iterazione su tutti i file in una directory utilizzando boost :: filesystem e BOOST_FOREACH? Ho provatoIterate su tutti i file in una directory utilizzando BOOST_FOREACH

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

Questo codice compila, corre, ma non produce il risultato desiderato.

risposta

28

È possibile scorrere i file in una directory rispetto all'utilizzo BOOST_FOREACH come questo:

#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

tuo dirPath è o non è una sequenza, o si tratta di sequenza è di dimensioni 1.

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

itera BOOST_FOREACH oltre sequenze. Ma cosa si qualifica come sequenza, esattamente? Poiché BOOST_FOREACH è costruito su Boost.Range, supporta automaticamente quei tipi che Boost.Range riconosce come sequenze. In particolare, BOOST_FOREACH funziona con tipi che soddisfano il concetto di intervallo a passaggio singolo. Per esempio, possiamo usare BOOST_FOREACH con:

  • contenitori STL
  • array
  • stringhe null-terminata (char e wchar_t)
  • std :: coppia di iteratori

Nota
Il supporto per i contenitori STL è molto generale; conta tutto ciò che sembra un contenitore STL. Se ha nested iterator e const_iterator types e begin() e end() funzioni membro, BOOST_FOREACH saprà automaticamente come iterare su di esso. In questo modo boost :: iterator_range <> e boost :: sub_range <> funzionano con BOOST_FOREACH.

+0

Qualche suggerimento su come posso correggere il codice (utilizzando ancora BOOST_FOREACH)? – user763305

+0

È necessario passare qualcosa che FOREACH può iterare come una serie di file, ad esempio. Altrimenti non utilizzare FOREACH. – clyfe

1

Così ho indovinato ho perso la barca su questo, ma ho avuto un problema simile, anche dopo aver scoperto il codice che teoricamente dovrebbe funzionare. Il problema è che il tipo di dati boost :: filesystem :: path prende l'ultimo carattere di una stringa.

Stavo leggendo da un file e il mio percorso era "c: \ one \ two \ three". Ma quando ho fatto un tipo di dati di percorso, la stringa è stata cambiata in "c: \ one \ two \ thre". Non ho idea di cosa sia, ma a causa di ciò non è stata trovata la posizione del file e blah blah blah. Quello che ho fatto per risolvere il problema è stato semplicemente aggiungere un '\' alla fine. In questo modo rimuove la '\' invece della 'e'.

ha funzionato bene dopo quello. Ma come detto prima, non ho idea del perché lo abbia fatto. Spero che questo aiuti qualcuno.