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
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;
}
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
}
bien, pero funciona en Windows? – m4tx
Sí: http://msdn.microsoft.com/en-us/library/14h5k7ff.aspx –
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.
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
}
}
}
}
¿Cómo se obtiene el nombre del directorio en forma de cadena? – ar2015
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;
}
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
- 1. Crear carpetas automáticamente en el directorio C#
- 2. Listar todas las carpetas en el directorio
- 3. listado todas las imágenes en un directorio usando PHP
- 4. negar el listado de directorios con .htaccess
- 5. Listado de contenido del directorio usando C y Windows
- 6. Comportamiento raro de irb, listado del contenido del directorio actual
- 7. Obtener el nombre de las carpetas del directorio de Activos
- 8. Listado recursivo de directorios en dos
- 9. Deshabilitar listado de directorios en IIS
- 10. scandir() para encontrar las carpetas en un directorio (PHP)
- 11. Listado de fuentes disponibles en PHP
- 12. Historial de cambios en el listado a través de webdav
- 13. Búsqueda de Visual Studio en Carpetas Seleccionadas o Tipos de Archivos Solamente
- 14. Listado de archivos en un directorio que coincida con un patrón en Java
- 15. Reemplazar el listado de directorios con el enrutamiento MVC URL
- 16. Consulta de la lista de archivos y carpetas en el directorio raíz
- 17. Listado de directorios de Sharpssh
- 18. listado grupo yum
- 19. Carpetas obstruidas en Subversion
- 20. UNIX/BASH: archivos de listado modificados en el mes específico
- 21. listado de versiones múltiples en pypi
- 22. Listado de puertos serie (COM) en Windows?
- 23. Clases de listado en un archivo jar
- 24. miembros Declarar solamente en el constructor
- 25. Cómo organizar el código fuente de Android en carpetas
- 26. Listado de todos los certificados instalados en android
- 27. Java está instalado, en el listado, pero la ejecución produce "./java: No existe ningún archivo o directorio"
- 28. Cómo eliminar el enlace 'Directorio principal' de la carpeta raíz en la lista del directorio Apache
- 29. Estructura de carpetas estáticas en Django 1.4?
- 30. Cómo enumerar todas las carpetas y archivos en el directorio después de conectar a través de sftp en python
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