【发布时间】:2014-10-01 04:49:37
【问题描述】:
如何仅搜索文件夹(在使用 boost 遍历目录时)?如何过滤我的结果以仅获取文件夹?
我已经尝试过使用名称,但是文件夹可能会被奇怪地命名,看起来好像它们有扩展名,我必须处理这个问题,因为我试图通过一个非常大且非常混乱的目录进行稳健搜索(我不允许只需清理它,它必须按原样搜索和过滤......)
谢谢
【问题讨论】:
标签: c++ boost iterator directory
如何仅搜索文件夹(在使用 boost 遍历目录时)?如何过滤我的结果以仅获取文件夹?
我已经尝试过使用名称,但是文件夹可能会被奇怪地命名,看起来好像它们有扩展名,我必须处理这个问题,因为我试图通过一个非常大且非常混乱的目录进行稳健搜索(我不允许只需清理它,它必须按原样搜索和过滤......)
谢谢
【问题讨论】:
标签: c++ boost iterator directory
该问题不包括已经尝试过的内容,因此如果尚未完成,那么以下内容肯定会有所帮助:
http://www.boost.org/doc/libs/1_49_0/libs/filesystem/v3/doc/tutorial.html#Directory-iteration
目录迭代加捕获异常 - (tut3.cpp)
Boost.Filesystem 的 directory_iterator 类正是我们这里所需要的。它遵循标准库的 istream_iterator 的一般模式。从路径构造,它迭代目录的内容。默认构造的 directory_iterator 充当结束迭代器。
directory_iterator 的值类型是 directory_entry。 directory_entry 对象包含路径和文件状态信息。 directory_entry 对象可以直接使用,也可以在函数调用中传递给路径参数。
另一个需要是在面对可能影响文件系统操作的多种错误时提高鲁棒性。我们可以在每次调用 Boost.Filesystem 函数时这样做(参见错误报告),但提供一个整体的 try/catch 块更容易。
tut3.cpp
int main(int argc, char* argv[])
{
path p (argv[1]); // p reads clearer than argv[1] in the following code
try
{
if (exists(p)) // does p actually exist?
{
if (is_regular_file(p)) // is p a regular file?
cout << p << " size is " << file_size(p) << '\n';
else if (is_directory(p)) // is p a directory?
{
cout << p << " is a directory containing:\n";
copy(directory_iterator(p), directory_iterator(), // directory_iterator::value_type
ostream_iterator<directory_entry>(cout, "\n")); // is directory_entry, which is
// converted to a path by the
// path stream inserter
}
else
cout << p << " exists, but is neither a regular file nor a directory\n";
}
else
cout << p << " does not exist\n";
}
catch (const filesystem_error& ex)
{
cout << ex.what() << '\n';
}
return 0;
}
【讨论】:
if (is_directory(p)) // is p a directory? 这正是我一直在寻找的东西,没有找到它感觉很愚蠢,但我对提升很陌生。其他错误检查也可能有用。谢谢!