Boost目录迭代器“没有这样的文件或目录”错误

3

我使用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文件的文件夹,其命名模式为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++;
  }

无法解决错误。


请提供一个完整的示例(pcdFileDir是什么?)。此外,考虑使用基于范围的for循环:for (auto &file : boost::filesystem::directory_iterator(dir)) - Chris
@ChrisStathis 使用基于范围的for循环可能更好,具体取决于您的观点,但它并不能解决错误。我将更新问题以反映这一点。 - wfehrnstrom
3个回答

0

我曾经遇到过同样的问题,一开始boost抛出了和你一样的错误,然后又开始抛出std::bad_alloc。我通过两个步骤解决了这个问题。

  1. 我使用与编译我的项目相同版本的GCC构建了boost库。由于目标机器上有不同版本的GCC(4.4.7和6.3.0),我猜测可能会因此引起一些问题。
  2. 我删除了所有cmake临时文件夹和文件,并从头重新构建了我的项目。如果您使用cmake,请尝试此方法。别忘了“make clean”。

我认为解决问题的关键是第二步。


0

对我来说,问题是由于我编译时使用了 -D_GLIBCXX_USE_CXX11_ABI = 0

CXXFLAGS 中删除它解决了这个问题。


0
这里我提出了两个解决方案来解决我的问题:
1. 确保你要遍历的目录中没有任何文件/文件夹的名称包含Unicode字符。如果是这种情况,你需要使用构造函数(而不是)创建你的boost::filesystem::path对象(例如,在你的情况下是pcdFileDir)。
2. (仅适用于Windows)确保你要遍历的目录中没有一个文件夹/文件的路径超过Windows上路径的最大长度(约256个字符)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接