2013-04-19 46 views
5

Tôi đang sử dụng trình lặp tăng cường "recursive_directory_iterator" để đệ quy quét qua thư mục. Tuy nhiên, khi trình vòng lặp chạy vào một thư mục mà ứng dụng của tôi không có quyền truy cập, ngoại lệ loại "boost :: filesystem3 :: filesystem_error" được ném, điều này làm dừng trình lặp và hủy bỏ chương trình. Có anyway tôi có thể hướng dẫn các iterator để bỏ qua các thư mục như vậy.recursive_directory_iterator ném ngoại lệ

Tôi đã thử mã được đề xuất tại Traversing a directory with boost::filesystem without throwing exceptions Tuy nhiên, nó cũng không hoạt động đối với tôi. Tôi đang sử dụng phiên bản boost 1.49.

Mã của tôi sau khi làm theo gợi ý (tốt nhất mà tôi có thể đưa ra), trông giống như sau:

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; 
    } 
} 

Cảm ơn bạn, Ahmed.

+0

Tôi cập nhật phần gia tăng của vòng lặp for, và bây giờ tôi nhận được một lỗi khác: ***** Lỗi chương trình nội bộ - xác nhận (m_level> 0) không thành công trong void void :: filesystem3 :: detail :: recur_dir_itr_imp :: pop(): /usr/include/boost/filesystem/v3/operations.hpp(818): pop() trên recursive_directory_iterato r với mức <1 Hủy bỏ –

+0

Rõ ràng đây là một cái đã biết (chưa được sửa) lỗi: https://svn.boost.org/trac/boost/ticket/4494 –

+0

Tôi gặp vấn đề tương tự. Vẫn không cố định vào tháng 4 năm 2015? –

Trả lời

0

Bạn có thể sử dụng try-catch khối và nếu bạn bắt boost :: filesystem3 :: filesystem_error sau đó bạn có thể bỏ qua các lần lặp hiện tại:

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

Tôi là người mới đến C++, nhưng làm thế nào để sử dụng khối try-catch cho một câu lệnh trong vòng lặp for. Tôi đoán một tùy chọn là để biến vòng lặp for thành một vòng lặp while. Tôi sẽ thử nó. –

5

Đây là một lỗi được biết đến trong boost :: hệ thống tập tin (V3) : https://svn.boost.org/trac/boost/ticket/4494. Tùy thuộc vào nhu cầu của bạn, bạn có thể sử dụng V2 của thư viện thay thế (nó thậm chí có thể đi kèm với trình biên dịch của bạn dưới dạng std::tr2::filesystem). Một lựa chọn khác là tự mình thực hiện phần đệ quy.

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; 
    } 
} 

Mã trên chỉ là để đưa ra ý tưởng chung, kiểm tra lỗi trong số những thứ khác bị thiếu.