Boost::filesystem directory_iterator迭代器

    最方便的一个功能是遍历path里的所有内容。directory_iterator。

     path p;

     directory_iterator(p)就是迭代器的起点,无参数的directory_iterator()就是迭代器的终点。

          获取目录下的所有文件名

  1. #include   
  2. namespace fs = boost::filesystem;  
  3.   
  4. int get_filenames(const std::string& dir, std::vector& filenames)  
  5. {  
  6.     fs::path path(dir);  
  7.     if (!fs::exists(path))  
  8.     {  
  9.         return -1;  
  10.     }  
  11.   
  12.     fs::directory_iterator end_iter;  
  13.     for (fs::directory_iterator iter(path); iter!=end_iter; ++iter)  
  14.     {  
  15.         if (fs::is_regular_file(iter->status()))  
  16.         {  
  17.             filenames.push_back(iter->path().string());  
  18.         }  
  19.   
  20.         if (fs::is_directory(iter->status()))  
  21.         {  
  22.             get_filenames(iter->path().string(), filenames);  
  23.         }  
  24.     }  
  25.   
  26.     return filenames.size();  
  27. }  
说明:  file_status status(path);

返回路径名对应的状态


路径迭代器

basic_directory_iterator

构造函数:

explicit basic_directory_iterator(const Path& dp); 
basic_directory_iterator();

basic_directory_iterator 从构造参数得到目录,每一次调用 operator++,它就查找并得到下一个文件名直到目录元素的末尾。不带参数的构造函数 basic_directory_iterator() 总是构造一个 end 迭代器对象,它是唯一一个用于结束条件的合法迭代器。

示例代码,得到指定目录下的所有文件名:

  1. void find_file( const fs::path & dir_path )
  2. {
  3.     if ( !fs::exists( dir_path ) ) return;
  4.     fs::directory_iterator end_itr; // 缺省构造生成一个结束迭代器
  5.     for ( fs::directory_iterator itr( dir_path ); itr != end_itr; ++itr )
  6.     {
  7.         if ( fs::is_directory(itr->status()) )
  8.         {
  9.             find_file( itr->path() ); //递归查找
  10.         }
  11.         else
  12.         {
  13.             std::cout << *itr << std::endl;
  14.         }
  15.   }
  16. }

boost递归遍历文件夹


#include 
#include 

void resucurePath(boost::filesystem::path src_path, boost::filesystem::path dest_path)
{
  using namespace boost::filesystem;
  if (is_directory(src_path))
  {
    directory_iterator tmp_directory_end;
    directory_iterator tmp_dir_it(src_path);

    for (tmp_dir_it; tmp_dir_it != tmp_directory_end; tmp_dir_it++)
    {
      path child_dest_path = dest_path;
      if (is_directory(*tmp_dir_it))
      {
        std::string tmp_dir_name = (*tmp_dir_it).path().filename().string();
        child_dest_path.append(tmp_dir_name.begin(), tmp_dir_name.end());

        if (!exists(child_dest_path))
        {
          create_directory(child_dest_path);
        }
        std::cout << child_dest_path << std::endl;
      }
      else
      {
        std::string tmp_dir_name = (*tmp_dir_it).path().stem().string();
        child_dest_path.append(tmp_dir_name.begin(), tmp_dir_name.end());
      }
      resucurePath((*tmp_dir_it).path(), child_dest_path);
    }
  }
  else if (is_regular_file(src_path))
  {
    FILE *fp(NULL);
    fp = fopen(dest_path.string().c_str(), "w+b");
    fclose(fp);
    fp = NULL;
    std::cout << dest_path << std::endl;
  }
  
}

void main()
{
  using namespace boost::filesystem;
  path src_path("E:/test/test_dir/test_src");
  path dest_path("E:/test/test_dir/test_dest");
  resucurePath(src_path, dest_path);
}

你可能感兴趣的:(C++)