我使用以下方法递归遍历目录中的所有文件:
try
{
for ( bf::recursive_directory_iterator end, dir("./");
dir != end; ++dir )
{
const bf::path &p = dir->path();
if(bf::is_regular_file(p))
{
std::cout << "File found: " << p.string() << std::endl;
}
}
} catch (const bf::filesystem_error& ex) {
std::cerr << ex.what() << '\n';
}
但这包括隐藏目录中的隐藏文件和文件。
如何过滤掉这些文件?如果需要,我可以将自己限制在隐藏文件和目录以'。'开头的平台上。字符。
答案 0 :(得分:5)
不幸的是,似乎没有一种处理“隐藏”的跨平台方式。以下适用于类Unix平台:
首先定义:
bool isHidden(const bf::path &p)
{
bf::path::string_type name = p.filename();
if(name != ".." &&
name != "." &&
name[0] == '.')
{
return true;
}
return false;
}
然后遍历文件变为:
try
{
for ( bf::recursive_directory_iterator end, dir("./");
dir != end; ++dir)
{
const bf::path &p = dir->path();
//Hidden directory, don't recurse into it
if(bf::is_directory(p) && isHidden(p))
{
dir.no_push();
continue;
}
if(bf::is_regular_file(p) && !isHidden(p))
{
std::cout << "File found: " << p.string() << std::endl;
}
}
} catch (const bf::filesystem_error& ex) {
std::cerr << ex.what() << '\n';
}
答案 1 :(得分:1)
我们现在假设您要忽略以'.'
开头的文件。这是Unix中隐藏文件的标准指示。我建议编写一个递归函数来访问每个文件。在伪代码中,它看起来像这样:
visitDirectory dir
for each file in dir
if the filename of file does not begin with a '.'
if file is a directory
visitDirectory file
else
do something with file (perhas as a separate function call?)
这避免了搜索文件的整个路径以确定我们是否要处理它的需要。相反,我们只是跳过任何“隐藏”的目录。
如果你喜欢的话,我也可以想到几个迭代解决方案。一种是使用堆栈或队列来跟踪下一个要访问的目录。基本上,这会使用您自己的数据结构模拟递归版本。或者,如果您坚持解析文件的完整路径,只需确保获得绝对路径。这样可以保证您不会遇到名称为“./”或“../”的目录,这会导致检查隐藏文件时出现问题。