Я перебираю все файлы в каталоге рекурсивно, используя следующее:
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';
}
Но это включает в себя скрытые файлы и файлы в скрытых каталогах.
Как мне отфильтровать эти файлы? При необходимости я могу ограничиться платформой, где скрытые файлы и каталоги начинаются с ‘.’ персонаж.
К сожалению, не существует кроссплатформенного способа обработки «скрытого». На 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';
}
Давайте пока предположим, что вы хотите игнорировать файлы, которые начинаются с '.'
, Это стандартная индикация в 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?)
Это избавляет от необходимости искать по всему пути файла, чтобы определить, хотим ли мы иметь дело с ним. Вместо этого мы просто пропускаем любые каталоги, которые «скрыты».
Я могу также подумать о нескольких итерационных решениях, если вы предпочитаете это. Одним из них является наличие стека или очереди, чтобы отслеживать, какой каталог посетить в следующий раз. В основном это эмулирует рекурсивную версию с вашей собственной структурой данных. В качестве альтернативы, если вы застряли при разборе полного пути к файлу, просто убедитесь, что вы получили абсолютный путь. Это гарантирует, что вы не встретите каталог с таким именем, как «./» или «../», что может вызвать проблемы с проверкой скрытого файла.