【发布时间】:2017-01-04 23:37:56
【问题描述】:
我正在使用 boost::filesystem::directory_iterator 迭代文件夹的内容(非递归)并计算文件夹中有多少元素。我可以遍历整个文件夹,但是当 boost::filesystem::directory_iterator 前进到 end 迭代器时会抛出一个错误:
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"
如您所见,它正确地覆盖了文件夹中的每个元素。
编辑:使用 @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)) -
@ChrisStathis 根据您的观点,使用基于范围的 for 循环可能是更好的设计,但它不能解决错误。我将更新问题以反映这一点
标签: c++ boost iterator directory filesystems