Я хочу перечислить папки в каталоге на С++, в идеале, в переносном (работающем в основных операционных системах) пути. Я пытался использовать POSIX, и он работает правильно, но как я могу определить, является ли найденный элемент папкой?
Список только каталогов в каталоге
Ответ 1
Использование библиотеки С++ 17 std::filesystem
:
std::vector<std::string> get_directories(const std::string& s)
{
std::vector<std::string> r;
for(auto& p : std::filesystem::recursive_directory_iterator(s))
if (p.is_directory())
r.push_back(p.path().string());
return r;
}
Ответ 2
Вы можете использовать opendir()
и readdir()
для отображения каталогов и подкаталогов. Следующий пример печатает все подкаталоги внутри текущего пути:
#include <dirent.h>
#include <stdio.h>
int main()
{
const char* PATH = ".";
DIR *dir = opendir(PATH);
struct dirent *entry = readdir(dir);
while (entry != NULL)
{
if (entry->d_type == DT_DIR)
printf("%s\n", entry->d_name);
entry = readdir(dir);
}
closedir(dir);
return 0;
}
Ответ 3
Здесь следует (слегка измененная) цитата из форматировать документацию файловой системы, чтобы показать вам, как это можно сделать:
void iterate_over_directories( const path & dir_path ) // in this directory,
{
if ( exists( dir_path ) )
{
directory_iterator end_itr; // default construction yields past-the-end
for ( directory_iterator itr( dir_path );
itr != end_itr;
++itr )
{
if ( is_directory(itr->status()) )
{
//... here you have a directory
}
}
}
}
Ответ 4
Посмотрите функцию stat
. Вот описание. Пример кода:
struct stat st;
const char *dirname = "dir_name";
if( stat( dirname, &st ) == 0 && S_ISDIR( st.st_mode ) ) {
// "dir_name" is a subdirectory of the current directory
} else {
// "dir_name" doesn't exist or isn't a directory
}
Ответ 5
Я вынужден сказать PhysFS. Я просто интегрировал его в свой собственный проект. Он обеспечивает настоящую кросс-платформенную (Mac/Linux/PC) файловую операцию и может даже распаковать различные определения архива, такие как zip, 7zip, pak и т.д. Он имеет несколько функций (PHYSFS_isDirectory, PHYSFS_enumerateFiles), который может определите, что вы просите также.
Ответ 6
В Windows вы можете использовать _findfirst() и _findnext() для итерации содержимого каталога, а затем использовать CreateFile() и GetFileInformationByHandle(), чтобы определить, является ли конкретная запись каталогом или папкой. (Да, CreateFile(), с соответствующими аргументами, для проверки существующего файла. Не жизнь великая?)
Для справки, некоторые классы, где я реализовал код, который использует эти вызовы, можно увидеть здесь и здесь