简体   繁体   中英

Counting the number of files in a directory using C

如何在Linux平台上使用C计算目录中的文件数。

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

readdir

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM