Мы находимся в 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;
}