【问题标题】:Listing only folders in directory仅列出目录中的文件夹
【发布时间】:2011-06-29 22:16:03
【问题描述】:

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

【问题讨论】:

    标签: c++ posix


    【解决方案1】:

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

    【讨论】:

    • 您可以使用这些功能仅选择文件夹。我添加了一个示例来向您展示如何操作。
    • [错误] 'struct dirent' 没有名为 'd_type' 的成员。为什么会出现此错误?
    • 感谢这个伟大的 anwser。我正在使用 linux,我想知道如何列出链接目录。
    • @andreasdr 哇,那条评论是 5 年前写的 :)) 还是谢谢!
    【解决方案2】:

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

    【讨论】:

    • 我相信,由于这是更便携的方式并且仍然不使用任何外部库,因此现在应该得到更多的接受答案。
    • 跨过本地应用程序路径后会出现分段错误。例如。列出 /home/$USER 的目录。这只是我还是这个文件系统在我的系统上非常不稳定?
    • 我相信p.status().type() == std::filesystem::file_type::directory 可以替换为p.is_directory(),除非有我不知道的细微差别。
    【解决方案3】:

    下面是来自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
          }
        }
      }
    }
    

    【讨论】:

    • 如何获取字符串形式的目录名?
    • 请注意,boost::filesystem 需要构建。它不仅仅是标题。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      我不得不提及PhysFS。我只是将它集成到我自己的项目中。它提供真正的跨平台(Mac/Linux/PC)文件操作,甚至可以解压各种压缩包定义,如zip、7zip、pak等。它有一些函数(PHYSFS_isDirectory、PHYSFS_enumerateFiles)也可以确定您的要求。

      【讨论】:

        【解决方案6】:

        在 Windows 下,可以使用 _findfirst() 和 _findnext() 来遍历目录的内容,然后使用 CreateFile() 和 GetFileInformationByHandle() 来确定特定条目是目录还是文件夹。 (是的,使用适当的参数 CreateFile() 来检查现有文件。生活不是很美好吗?)

        作为参考,可以看到我实现了使用这些调用的代码的一些类here 和here

        【讨论】:

        • 链接已失效。一个示例代码会很有帮助。
        • @Burak 我修复了链接。
        猜你喜欢
        • 2013-12-25
        • 1970-01-01
        • 1970-01-01
        • 2016-01-28
        • 1970-01-01
        • 2012-08-11
        • 2013-04-29
        • 2020-12-22
        • 1970-01-01
        相关资源
        最近更新 更多