2013-04-19 14 views
5

Tekrar tekrar bir dizinde taramak için destekleyici "recursive_directory_iterator" desteğini kullanıyorum. Ancak, yineleyici uygulamanızın erişiminin olmadığı bir dizine girdiğinde, "boost :: filesystem3 :: filesystem_error" türü dışında, yineleyiciyi ve programı iptal eden durdurulur. Yinede, yineleyiciye bu dizinleri atlamasını emredebilirim.recursive_directory_iterator istisnayı atar

Traversing a directory with boost::filesystem without throwing exceptions'de önerilen kodu denedim, ancak ne iş yaptı ne de işe yaradı. Boost versiyon 1.49 kullanıyorum.

void scand() 
{ 
    boost::system::error_code ec, no_err; 

    // Read dir contents recurs 
    for (recursive_directory_iterator end, _path("/tmp", ec); 
     _path != end; _path.increment(ec)) { 

     if (ec != no_err) { 
      _path.pop(); 
      continue; 
     } 
     cout << _path->path() << endl; 
    } 
} 

, Ahmed teşekkür ederiz:

Kodum öneri aşağıdaki gibi (Ben ile gelebilir en iyi), bakar izledikten sonra.

+0

Ben for döngüsünün artım parçasını güncellenen ve şimdi farklı bir hata alıyorum: ***** İç Programı Hata - iddiasını (m_level> 0) void boost :: filesystem3 başarısız :: detay :: recur_dir_itr_imp :: açılır(): /usr/include/boost/filesystem/v3/operations.hpp(818) seviyesi ile recursive_directory_iterato r pop() <1 durdurulan –

+0

Görünüşe göre bu bilinen (henüz tespit edilecek) bug: https://svn.boost.org/trac/boost/ticket/4494 –

+0

Aynı sorunu yaşıyorum. Nisan 2015'te hala sabit değil misiniz? –

cevap

0

denemek-catch blokları kullanabilir ve boost yakalarsanız :: filesystem3 :: filesystem_error o zaman geçerli yineleme atlayabilirsiniz:

void scand() 
{ 
    boost::system::error_code ec, no_err; 

    // Read dir contents recurs 
    recursive_directory_iterator end; 
    _path("/tmp", ec); 
    while (_path != end) { 
     try 
     { 
     if (ec != no_err) { 
     _path.pop(); 
      continue; 
     } 
     cout << _path->path() << endl; 
    } 
    catch(boost::filesystem3::filesystem_error e) 
    { 

    } 
    _path++; 
    } 
} 
+0

C++ 'ya yeni durumdayım, ancak for döngüsünde ifade için try-catch bloğunu nasıl kullanırım. Sanırım bir seçenek döngü için bir süre döngüsüne çevirmektir. Denerim. –

5

Bu boost bilinen bir hata :: dosya sistemi (V3) : https://svn.boost.org/trac/boost/ticket/4494. İhtiyaçlarınıza bağlı olarak kütüphanenin V2'sini kullanabilirsiniz (derleyicinizle std::tr2::filesystem şeklinde bile gelebilir). Diğer bir seçenek, özyinelemeyi kendiniz uygulamaktır.

boost::system::error_code ec; 
std::deque<boost::filesystem::path> directories {initialDir}; 
while(!directories.empty()) 
{ 
    boost::filesystem::directory_iterator dit(directories.front(), ec); 
    directories.pop_front(); 
    while(dit != boost::filesystem::directory_iterator()) 
    { 
    if(boost::filesystem::is_directory(dit->path(), ec)) 
    { 
     directories.push_back(dit->path()); 
    } 
    HandleFile(dit->path()); // <-- do something with the file 
    ++dit; 
    } 
} 

Yukarıdaki kod yalnızca genel bir fikir vermek, diğer şeyler arasında hata denetimi eksik.

İlgili konular