Contando el número de archivos en un directorio usando C

3 minutos de lectura

¿Cómo puedo contar la cantidad de archivos en un directorio usando C en la plataforma Linux?

avatar de usuario
michiel buddingh

No hay garantía de que este código se compile, y en realidad solo es compatible con Linux y BSD:

#include <dirent.h>

...

int file_count = 0;
DIR * dirp;
struct dirent * entry;

dirp = opendir("path"); /* There should be error handling after this */
while ((entry = readdir(dirp)) != NULL) {
    if (entry->d_type == DT_REG) { /* If the entry is a regular file */
         file_count++;
    }
}
closedir(dirp);

  • Si desea procesar archivos en subdirectorios, puede recurrir cuando encuentre una entrada de directorio. Asegúrese de excluir “.” y “..” si haces esto.

    – Jay Conrod

    13 de julio de 2009 a las 19:07

  • Buen trabajo en la captura de la dirección incluyen.

    -Michiel Buddingh

    13 de julio de 2009 a las 19:09

  • Sí, son funciones POSIX.

    – pengurú

    27 de agosto de 2009 a las 13:04

  • POSIX especifica solo d_ino y d_name como miembros de la estructura de dirección. Este código prueba para d_type, que es específico de la plataforma.

    -Michiel Buddingh

    27 de agosto de 2009 a las 19:50

  • En caso de que alguien se pregunte por qué debe recorrer y por qué no hay una función para obtener cuántos archivos hay en un directorio en tiempo constante, encontré esto: blogs.msdn.com/b/oldnewthing/archive/2009/02/17/9426787.aspx

    – sudo

    07/08/2015 a las 22:32


avatar de usuario
KevinDTimm

Ver readdir.

Si también desea incluir subdirectorios, puede usar esta función que estoy usando en parte de mi código. Probablemente debería modificarlo para incluir más verificación de errores y admitir diferentes separadores de directorio.

int countfiles(char *path) {
    DIR *dir_ptr = NULL;
    struct dirent *direntp;
    char *npath;
    if (!path) return 0;
    if( (dir_ptr = opendir(path)) == NULL ) return 0;

    int count=0;
    while( (direntp = readdir(dir_ptr)))
    {
        if (strcmp(direntp->d_name,".")==0 ||
            strcmp(direntp->d_name,"..")==0) continue;
        switch (direntp->d_type) {
            case DT_REG:
                ++count;
                break;
            case DT_DIR:            
                npath=malloc(strlen(path)+strlen(direntp->d_name)+2);
                sprintf(npath,"%s/%s",path, direntp->d_name);
                count += countfiles(npath);
                free(npath);
                break;
        }
    }
    closedir(dir_ptr);
    return count;
}

avatar de usuario
michi

Si no te importa el directorio actual . y el directorio principal.. como estos:

drwxr-xr-x  3 michi michi      4096 Dec 21 15:54 .
drwx------ 30 michi michi     12288 Jan  3 10:23 ..

Puedes hacer algo como esto:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

int main (void){
    size_t count = 0;
    struct dirent *res;
    struct stat sb;
    const char *path = "/home/michi/";

    if (stat(path, &sb) == 0 && S_ISDIR(sb.st_mode)){
        DIR *folder = opendir ( path );

        if (access ( path, F_OK ) != -1 ){
            if ( folder ){
                while ( ( res = readdir ( folder ) ) ){
                    if ( strcmp( res->d_name, "." ) && strcmp( res->d_name, ".." ) ){
                        printf("%zu) - %s\n", count + 1, res->d_name);
                        count++;
                    }
                }

                closedir ( folder );
            }else{
                perror ( "Could not open the directory" );
                exit( EXIT_FAILURE);
            }
        }

    }else{
        printf("The %s it cannot be opened or is not a directory\n", path);
        exit( EXIT_FAILURE);
    }

    printf( "\n\tFound %zu Files\n", count );
}

Producción:

1) - .gnome2
2) - .linuxmint
3) - .xsession-errors
4) - .nano
5) - .kde
6) - .xsession-errors.old
7) - .gnome2_private
8) - Public
9) - .gconf
10) - .bashrc
11) - .macromedia
12) - .thunderbird
13) - Pictures
14) - .profile
15) - .cinnamon
16) - .pki
17) - Compile
18) - Desktop
19) - .Private
20) - .cache
21) - .Xauthority
22) - .ICEauthority
23) - VirtualBox VMs
24) - .bash_history
25) - .mozilla
26) - .local
27) - .config
28) - .codeblocks
29) - Documents
30) - .bash_logout
31) - Videos
32) - Templates
33) - Downloads
34) - .adobe
35) - .gphoto
36) - Music
37) - .dbus
38) - .ecryptfs
39) - .sudo_as_admin_successful
40) - .gnome

    Found 40 Files

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad