Список только папок в каталоге - PullRequest
19 голосов
/ 18 февраля 2011

Я хочу перечислить папки в каталоге на C ++, в идеале в переносимом (работающем в основных операционных системах) виде.Я пытался использовать POSIX, и он работает правильно, но как я могу определить, является ли найденный элемент папкой?

Ответы [ 6 ]

26 голосов
/ 18 февраля 2011

Вы можете использовать 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;
}
10 голосов
/ 18 февраля 2011

Далее следует (слегка измененная) цитата из документации по файловой системе boost , чтобы показать, как это можно сделать:

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
      }
    }
  }
}
8 голосов
/ 05 октября 2017

Использование библиотеки C ++ 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;
}
5 голосов
/ 18 февраля 2011

Посмотрите на функцию 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
}
2 голосов
/ 18 февраля 2011

Я чувствую себя обязанным упомянуть PhysFS . Я просто интегрировал это в свой собственный проект. Он обеспечивает истинные кросс-платформенные (Mac / Linux / PC) файловые операции и может даже распаковывать различные определения архивов, такие как zip, 7zip, pak и так далее. Он имеет несколько функций ( PHYSFS_isDirectory , PHYSFS_enumerateFiles ), которые также могут определять, что вы запрашиваете.

1 голос
/ 18 февраля 2011

В Windows вы можете использовать _findfirst () и _findnext () для перебора содержимого каталога, а затем использовать CreateFile () и GetFileInformationByHandle (), чтобы определить, является ли конкретная запись каталогом или папкой. (Да, CreateFile () с соответствующими аргументами для проверки существующего файла. Разве жизнь не велика?)

Для справки, некоторые классы, в которых я реализовал код, использующий эти вызовы, можно увидеть здесь и здесь

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