Counting the number of files in a directory using C

前端 未结 4 786
执念已碎
执念已碎 2020-12-03 04:58

How can I count the number of files in a directory using C on linux platform.

相关标签:
4条回答
  • 2020-12-03 05:35

    See readdir.

    0 讨论(0)
  • 2020-12-03 05:36

    No guarantee that this code compiles, and it's really only compatible with Linux and the BSDs:

    #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);
    
    0 讨论(0)
  • 2020-12-03 05:47

    If you do not care about current directory . and the parent directory.. like this ones:

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

    You can do something like this:

    #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 );
    }
    

    Output:

    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
    
    0 讨论(0)
  • 2020-12-03 05:58

    If you want to include subdirectories as well, you can use this function that I'm using in some of my code. You should probably modify it to include some more error checking and support different directory separators.

    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;
    }
    
    0 讨论(0)
提交回复
热议问题