我在使用以下功能时遇到了一些麻烦。它应该被赋予一个路径和一组允许的文件扩展名,然后使用任何这些扩展名查找该路径中的所有文件。相反,它什么都没找到并返回一个空集。
std::set<boostfs::path> scan_directory(const boostfs::path& p,
const bool recurse,
const std::set<std::string>& allowed) {
std::string ext ;
std::set<boostfs::path> incs, incs2 ;
boostfs::path::iterator itr ;
// Extract directory and filename
boostfs::path file = p.filename() ;
boostfs::path dir = p.parent_path() ;
std::cout << "path: " << p.string() << std::endl ;
for (itr = dir.begin(); itr != dir.end(); ++itr) {
if (boostfs::is_directory(*itr)) {
if (recurse) {
std::cout << "dir: " << itr->string() << std::endl ;
incs2 = scan_directory(*itr, true, allowed) ;
incs.insert(incs2.begin(), incs2.end()) ;
}
} else {
// Don't include the original source
if (*itr != p) {
// Include only allowed file types
ext = itr->extension().string() ;
std::cout << "file: " << itr->string() << std::endl ;
std::cout << "ext: " << ext << std::endl ;
if (allowed.find(ext) != allowed.end()) {
incs.insert(*itr) ;
}
}
}
}
return incs ;
}
cout的打印仅用于调试。我正在使用以下目录结构对其进行测试:
./test/cpp/
foo.cpp
foo.h
test.cpp
./test/cpp/bar/
baz.cpp
baz.h
我使用路径“test / cpp / test.cpp”调用该函数,recurse为true,并且包含一个字符串“.cpp”的集合。我从打印件中获得以下输出,
path: test/cpp/test.cpp
dir: test
path: test
file: cpp
ext:
然后函数结束,程序的其余部分继续,只有它被赋予一组空的文件,所以没有多少工作。给定测试目录,它应该返回一个包含“test / cpp / foo.cpp”和“test / cpp / bar / baz.cpp”的集合。
我很确定它不久前就可以使用,但我不确定它什么时候坏了或我做了什么让它这样做了。我确信这是一个小的,恼人的技术性。
答案 0 :(得分:1)
我发现了我的问题。我使用path::iterator
而不是directory_iterator
(或recursive_directory_iterator
),因此我循环遍历路径的组件而不是目录的内容。我本可以早点发誓,但也许这可能是运气。
这是我的工作代码
std::set<boostfs::path> scan_directory(const boostfs::path& p,
const bool recurse,
const std::set<std::string>& allowed) {
std::string ext ;
std::set<boostfs::path> incs ;
// Extract directory and filename
boostfs::path file = p.filename() ;
boostfs::path dir = p.parent_path() ;
boostfs::recursive_directory_iterator itr(dir), itr_end ;
while(itr != itr_end) {
if (boostfs::is_directory(*itr)) {
itr.no_push(!recurse) ;
} else {
// Don't include the original source
if (*itr != p) {
// Include only allowed file types
ext = itr->path().extension().string() ;
if (allowed.find(ext) != allowed.end()) {
incs.insert(*itr) ;
}
}
}
itr++ ;
}
return incs ;
}
我会让人知道在Boost的文档中迭代目录的例子是AWFUL