Как игнорировать скрытые файлы (и файлы в скрытых каталогах) с помощью Boost Filesystem?

Я перебираю все файлы в каталоге рекурсивно, используя следующее:

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';
}

Но это включает в себя скрытые файлы и файлы в скрытых каталогах.

Как мне отфильтровать эти файлы? При необходимости я могу ограничиться платформой, где скрытые файлы и каталоги начинаются с ‘.’ персонаж.

8

Решение

К сожалению, не существует кроссплатформенного способа обработки «скрытого». На 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';
}
5

Другие решения

Давайте пока предположим, что вы хотите игнорировать файлы, которые начинаются с '.', Это стандартная индикация в 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?)

Это избавляет от необходимости искать по всему пути файла, чтобы определить, хотим ли мы иметь дело с ним. Вместо этого мы просто пропускаем любые каталоги, которые «скрыты».

Я могу также подумать о нескольких итерационных решениях, если вы предпочитаете это. Одним из них является наличие стека или очереди, чтобы отслеживать, какой каталог посетить в следующий раз. В основном это эмулирует рекурсивную версию с вашей собственной структурой данных. В качестве альтернативы, если вы застряли при разборе полного пути к файлу, просто убедитесь, что вы получили абсолютный путь. Это гарантирует, что вы не встретите каталог с таким именем, как «./» или «../», что может вызвать проблемы с проверкой скрытого файла.

1

По вопросам рекламы [email protected]