Как вы рекурсивно просматриваете каждый файл / каталог в стандартном C ++? - PullRequest
99 голосов
/ 16 сентября 2008

Как вы рекурсивно просматриваете каждый файл / каталог в стандартном C ++?

Ответы [ 14 ]

2 голосов
/ 16 сентября 2008

Для обхода файловой системы необходимо вызывать специфичные для ОС функции, такие как open() и readdir(). Стандарт C не определяет никаких функций, связанных с файловой системой.

1 голос
/ 16 сентября 2008

Ты не. Стандарт C ++ не раскрывает понятие каталога. В частности, это не дает никакого способа перечислить все файлы в каталоге.

Ужасным хаком было бы использование системных вызовов () и анализ результатов. Наиболее разумным решением было бы использовать некую кроссплатформенную библиотеку, такую ​​как Qt или даже POSIX .

0 голосов
/ 30 мая 2019

Мы находимся в 2019 году. У нас есть файловая система стандартная библиотека в C++. Filesystem library предоставляет средства для выполнения операций с файловыми системами и их компонентами, такими как пути, обычные файлы и каталоги.

На этой ссылке есть важное примечание, если вы рассматриваете проблемы переносимости. Там написано:

Средства библиотеки файловой системы могут быть недоступны, если иерархическая файловая система недоступна для реализации или если она не обеспечивает необходимые возможности. Некоторые функции могут быть недоступны, если они не поддерживаются базовой файловой системой (например, файловая система FAT не имеет символических ссылок и запрещает множественные жесткие ссылки). В этих случаях необходимо сообщать об ошибках.

Библиотека файловой системы изначально была разработана как boost.filesystem, была опубликована в виде технической спецификации ISO / IEC TS 18822: 2015 и, наконец, объединена с ISO C ++ с C ++ 17. Реализация boost в настоящее время доступна на большем количестве компиляторов и платформ, чем библиотека C ++ 17.

@ adi-shavit ответил на этот вопрос, когда он был частью std :: экспериментальный, и он обновил этот ответ в 2017 году. Я хочу дать более подробную информацию о библиотеке и показать более подробный пример.

std :: filesystem :: recursive_directory_iterator - это LegacyInputIterator, который перебирает элементы directory_entry каталога и, рекурсивно, над записями всех подкаталогов. Порядок итераций не указан, за исключением того, что каждая запись каталога посещается только один раз.

Если вы не хотите рекурсивно перебирать записи подкаталогов, тогда следует использовать directory_iterator .

Оба итератора возвращают объект directory_entry . directory_entry имеет различные полезные функции-члены, такие как is_regular_file, is_directory, is_socket, is_symlink и т. Д. Функция-член path() возвращает объект std :: filesystem :: path и может использоваться для получения file extension, filename, root name.

Рассмотрим пример ниже. Я использовал Ubuntu и скомпилировал его через терминал, используя

g ++ example.cpp --std = c ++ 17 -lstdc ++ fs -Wall

#include <iostream>
#include <string>
#include <filesystem>

void listFiles(std::string path)
{
    for (auto& dirEntry: std::filesystem::recursive_directory_iterator(path)) {
        if (!dirEntry.is_regular_file()) {
            std::cout << "Directory: " << dirEntry.path() << std::endl;
            continue;
        }
        std::filesystem::path file = dirEntry.path();
        std::cout << "Filename: " << file.filename() << " extension: " << file.extension() << std::endl;

    }
}

int main()
{
    listFiles("./");
    return 0;
}
0 голосов
/ 17 мая 2014

Если вы работаете в Windows, вы можете использовать FindFirstFile вместе с FindNextFile API. Вы можете использовать FindFileData.dwFileAttributes, чтобы проверить, является ли данный путь файлом или каталогом. Если это каталог, вы можете рекурсивно повторить алгоритм.

Здесь я собрал код, который перечисляет все файлы на компьютере с Windows.

http://dreams -soft.com / проекты / траверс-каталог

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...