2011-02-18 11 views
19

Quiero enumerar las carpetas en un directorio en C++, idealmente en una forma portátil (que funciona en los principales sistemas operativos). Intenté usar POSIX, y funciona correctamente, pero ¿cómo puedo identificar si el elemento encontrado es una carpeta?Listado de carpetas solamente en el directorio

Respuesta

5

Uso de la biblioteca ++ 17 std::filesystem C:

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

Creo que como esta es una forma más portátil y aún no usa ninguna biblioteca externa, merece más ser una respuesta aceptada ahora. – m4tx

4

Busque la función stat. Here es una descripción. Un código de ejemplo:

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

bien, pero funciona en Windows? – m4tx

+0

Sí: http://msdn.microsoft.com/en-us/library/14h5k7ff.aspx –

2

me siento obligado a mencionar PhysFS. Simplemente lo integé en mi propio proyecto. Proporciona verdaderas operaciones de archivos multiplataforma (Mac/Linux/PC) e incluso puede descomprimir varias definiciones de archivo como zip, 7zip, pak, etc. Tiene algunas funciones (PHYSFS_isDirectory, PHYSFS_enumerateFiles) que pueden determinar lo que está solicitando también.

10

Aquí sigue una cotización (ligeramente modificada) de la boost filesystem documentation para mostrar cómo se puede hacer:

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

¿Cómo se obtiene el nombre del directorio en forma de cadena? – ar2015

25

Usted podría utilizar opendir() y readdir() para listar directorios y subdirectorios. El siguiente ejemplo imprime todos los subdirectorios dentro de la trayectoria de la corriente:

#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

Puede seleccionar solo carpetas usando estas funciones. He agregado un ejemplo para mostrarte cómo. –

+0

OK, gracias. Funciona. :) – m4tx

+0

[Error] 'struct dirent' no tiene ningún miembro llamado 'd_type'. ¿Por qué obtengo este error? – Faridzs

1

Bajo Windows, puede utilizar _findfirst() y _findnext() para repetir el contenido de un directorio, y luego utilizar CreateFile() y GetFileInformationByHandle() para determinar si una entrada en particular es un directorio o una carpeta. (Sí, CreateFile(), con los argumentos adecuados, para examinar un archivo existente. No es grande la vida?)

Como referencia, algunas clases en las que he implementado el código que utiliza esas llamadas se puede ver here y here

Cuestiones relacionadas