我使用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个文件夹,其中包含模式为autzen_1、autzen_2等和autzen. PCD的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"
可以看到,它正确地覆盖了文件夹中的每个元素。
编辑:使用一个基于范围的for循环,由@Chris_Stathis与确切的语法建议:
for(auto &file : boost::filesystem::directory_iterator(pcdFileDir)){
std::cout << file.path() << std::endl;
file_count++;
}
不能解决错误。
我有同样的问题,首先boost抛出了与您相同的错误,然后它开始抛出std::bad_alloc。我分两步解决了这个问题。
- 我使用用于编译我的项目的GCC的相同版本构建了boost库。由于我的目标机器上有不同版本的GCC(4.4.7和6.3.0),我猜可能会有一些问题。
- 我删除了所有的cmake临时文件夹和文件,并从头开始重建我的项目。如果你使用cmake,试试这个。别忘了"make clean"。
我怀疑解决问题的关键是步骤2。
对我来说,这个问题是因为我使用- D_GLIBCXX_USE_CXX11_ABI=0
将其从CXXFLAGS
中移除解决了这个问题。
这里我提出两个解决方案来解决我的问题:
- 确保在您想要迭代的目录中,没有任何文件名中包含Unicode字符的文件/文件夹。如果是这种情况,你需要创建你的
boost::filesystem::path
对象(例如pcdFileDir
在你的情况下)与wstring
构造函数(而不是std::string
)。 - (仅适用于Windows)确保您正在迭代的目录中没有文件夹/文件的路径超过Windows上路径的最大长度。(~ 256字符)。