c++ - Boost 目录迭代器 "no such file or directory"

标签 c++ boost iterator directory filesystems

我正在使用 boost::filesystem::directory_iterator 迭代文件夹的内容(非递归地)并计算文件夹中有多少元素。我能够遍历整个文件夹,但是当 boost::filesystem::directory_iterator 前进到结束迭代器时会抛出一个错误:

libc++abi.dylib: terminating with uncaught exception of type boost::filesystem::filesystem_error: boost::filesystem::directory_iterator::construct: No such file or directory

我没有看到我在这段代码中如何错误地使用目录迭代器,这是抛出错误的代码:

boost::filesystem::path pcdFileDir(getPCDFilePath().string().substr(0, getPCDFilePath().string().find_last_of(boost::filesystem::path::preferred_separator)));
      std::cout << "pcdFileDirectory: " << pcdFileDir.string() << std::endl;
      size_t file_count = 0;
      for(boost::filesystem::directory_iterator itr(pcdFileDir); itr != boost::filesystem::directory_iterator(); ++itr){
        std::cout << itr->path() << std::endl;
        file_count++;
      }
      return file_count;
    }

pcdDir 的值为 ../out/autzen。在 ../out/autzen 中有 54 个文件夹包含 pcd 文件,这些文件遵循 patter autzen_1、autzen_2 等和 autzen.pcd。 for循环中print语句的输出是这样的:

"../out/autzen/autzen.pcd"
"../out/autzen/autzen_1"
"../out/autzen/autzen_10"
"../out/autzen/autzen_11"
"../out/autzen/autzen_12"
"../out/autzen/autzen_13"
"../out/autzen/autzen_14"
"../out/autzen/autzen_15"
"../out/autzen/autzen_16"
"../out/autzen/autzen_17"
"../out/autzen/autzen_18"
"../out/autzen/autzen_19"
"../out/autzen/autzen_2"
"../out/autzen/autzen_20"
"../out/autzen/autzen_21"
"../out/autzen/autzen_22"
"../out/autzen/autzen_23"
"../out/autzen/autzen_24"
"../out/autzen/autzen_25"
"../out/autzen/autzen_26"
"../out/autzen/autzen_27"
"../out/autzen/autzen_28"
"../out/autzen/autzen_29"
"../out/autzen/autzen_3"
"../out/autzen/autzen_30"
"../out/autzen/autzen_31"
"../out/autzen/autzen_32"
"../out/autzen/autzen_33"
"../out/autzen/autzen_34"
"../out/autzen/autzen_35"
"../out/autzen/autzen_36"
"../out/autzen/autzen_37"
"../out/autzen/autzen_38"
"../out/autzen/autzen_39"
"../out/autzen/autzen_4"
"../out/autzen/autzen_40"
"../out/autzen/autzen_41"
"../out/autzen/autzen_42"
"../out/autzen/autzen_43"
"../out/autzen/autzen_44"
"../out/autzen/autzen_45"
"../out/autzen/autzen_46"
"../out/autzen/autzen_47"
"../out/autzen/autzen_48"
"../out/autzen/autzen_49"
"../out/autzen/autzen_5"
"../out/autzen/autzen_50"
"../out/autzen/autzen_51"
"../out/autzen/autzen_52"
"../out/autzen/autzen_53"
"../out/autzen/autzen_54"
"../out/autzen/autzen_6"
"../out/autzen/autzen_7"
"../out/autzen/autzen_8"
"../out/autzen/autzen_9"

如您所见,它正确地覆盖了文件夹中的每个元素。

编辑:按照@Chris_Stathis 的建议使用基于范围的 for 循环,语法完全相同:

  for(auto &file : boost::filesystem::directory_iterator(pcdFileDir)){
    std::cout << file.path() << std::endl;
    file_count++;
  }

没有解决错误。

最佳答案

我遇到了同样的问题,起初 boost 抛出了和你一样的错误,然后它开始抛出 std::bad_alloc。我分两步解决了它。

  1. 我使用用于编译我的项目的相同版本的 GCC 构建了 boost 库。由于我在目标机器上有不同版本的 GCC(4.4.7 和 6.3.0),我想这可能会导致一些问题。
  2. 我删除了所有 cmake 临时文件夹和文件,并从头开始重建我的项目。如果你使用 cmake,试试这个。不要忘记“打扫卫生”。

我怀疑解决问题的关键是第2步。

关于c++ - Boost 目录迭代器 "no such file or directory",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39197778/

相关文章:

c++ - 改变参数值和数量——这是合法的 C++ 吗?

c++ - 如何将张量转换为图像数组?

c++ - 使用 ofstream 或 fstream 打开都不会出错,也不会打开文件

C++如何将方法作为模板参数传递

c++ - Boost::Spirit 与解析字符串的斗争

tensorflow - 数据集 API、迭代器和 tf.contrib.data.rejection_resample

java - 如果我们不知道容器类型中元素的类型,如何实现迭代器?

c++ - 模板化 typedef 上的模板函数

boost - boost::hash_combine 链接哪个库

c++ - 使用 boost::make_shared 创建 vector 元素无法正常工作