2011-02-18 211 views
19

我想在C++中列出目錄中的文件夾,理想情況是以便攜式(使用主要操作系統)方式列出文件夾。我嘗試使用POSIX,它工作正常,但我如何確定找到的項目是否是一個文件夾?僅列出目錄中的文件夾

回答

5

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

OK,但它在Windows上工作? – m4tx 2011-02-18 16:17:02

+0

是:http://msdn.microsoft.com/en-us/library/14h5k7ff.aspx – 2011-02-18 16:31:27

2

我覺得不得不提到PhysFS。我只是將它集成到我自己的項目中。它提供真正的跨平臺(Mac/Linux/PC)文件操作,甚至可以解壓zip,7zip,pak等各種存檔定義。它有幾個功能(PHYSFS_isDirectoryPHYSFS_enumerateFiles),它可以確定你所要求的。

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

如何以字符串的形式獲取目錄名? – ar2015 2017-07-05 01:17:54

25

你可以使用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; 
} 
+0

您可以使用這些功能僅選擇文件夾。我已經添加了一個例子來告訴你如何。 – 2011-02-18 16:12:18

1

在Windows下,你可以使用_findfirst()和_findnext()通過目錄的內容進行迭代,然後用CreateFile()和GetFileInformationByHandle()以確定特定條目是否是目錄或文件夾。 (是的,的CreateFile(),使用適當的參數,檢查現有的文件。是不是生活盛大?)

僅供參考,一些類,我實現的代碼,使用這些電話可以看出herehere

相關問題