仅列出目录中的文件夹

时间:2011-02-18 15:50:24

标签: c++ posix

我想在C ++目录中列出文件夹,理想情况是在便携式(以主要操作系统工作)方式。我尝试使用POSIX,它工作正常,但我怎样才能确定找到的项目是否是文件夹?

6 个答案:

答案 0 :(得分:26)

您可以使用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;
}

答案 1 :(得分:10)

以下是来自boost filesystem documentation的(稍加修改)引用,以向您展示如何完成此操作:

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

答案 2 :(得分:8)

使用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.status().type() == std::filesystem::file_type::directory)
            r.push_back(p.path().string());
    return r;
}

答案 3 :(得分:5)

查找stat功能。 Here是一种描述。一些示例代码:

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
}

答案 4 :(得分:2)

我觉得有必要提到PhysFS。我只是将它集成到我自己的项目中。它提供真正的跨平台(Mac / Linux / PC)文件操作,甚至可以解压缩各种存档定义,如zip,7zip,pak等。它有一些功能(PHYSFS_isDirectoryPHYSFS_enumerateFiles),可以确定您的要求。

答案 5 :(得分:1)

在Windows下,您可以使用_findfirst()和_findnext()迭代目录的内容,然后使用CreateFile()和GetFileInformationByHandle()来确定特定条目是目录还是文件夹。 (是的,CreateFile(),带有适当的参数,来检查现有文件。生命不是很盛大吗?)

作为参考,可以看到我实现使用这些调用的代码的某些类herehere