Linux目录遍历实现 -- 列出当前目录下所有文件

递归遍历目录,列出目录中的文件,代码:

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

#define MAX_PATH 512 //最大文件长度定义为512

/*对目录中所有文件执行print_file_info操作*/
void dirwalk(char *dir, void (*func)(char *))
{
    char name[MAX_PATH];
    struct dirent *dp;
    DIR *dfd;

    if((dfd = opendir(dir)) == NULL){
        fprintf(stderr, "dirwalk: can't open %s\n", dir);
        return;
    }

    while((dp = readdir(dfd)) != NULL){ //读目录记录项
        if(strcmp(dp->d_name, ".") == 0 || strcmp(dp -> d_name, "..") == 0){
            continue;  //跳过当前目录以及父目录
        }

        if(strlen(dir) + strlen(dp -> d_name) + 2 > sizeof(name)){
            fprintf(stderr, "dirwalk : name %s %s too long\n", dir, dp->d_name);
        }else{
            sprintf(name, "%s/%s", dir, dp->d_name);
            (*func)(name);
        }
    }
}

/*打印文件信息*/
void print_file_info(char *name)
{
    struct stat stbuf;

    if(stat(name, &stbuf) == -1){
        fprintf(stderr, "file size: open %s failed\n", name);
        return;
    }

    if((stbuf.st_mode & S_IFMT) == S_IFDIR){ 
        dirwalk(name, print_file_info);  //如果是目录遍历下一级目录
    }else{                          
        printf("%8ld %s\n", stbuf.st_size, name);//不是目录,打印文件size及name
    }
}

int main(int argc, char *argv[])
{
    printf("file size file name\n");
    if(argc == 1){
        print_file_info(".");//未加参数执行时,从当前目录开始遍历
    }else{
        while(--argc>0){
            print_file_info(*++argv);
        }
    }

    return 0;
}

程序运行及执行结果:

yu@ubuntu:~/Linux/206/dirop$ gcc -o dir dir.c 

yu@ubuntu:~/Linux/206/dirop$ ./dir 
file size    file name
    7820    ./dir
    1351    ./dir.c

yu@ubuntu:~/Linux/206/dirop$ ./dir /home/yu/Linux/206
file size    file name
    7560    /home/yu/Linux/206/copy
       0    /home/yu/Linux/206/src
    7820    /home/yu/Linux/206/dir
     487    /home/yu/Linux/206/copy.c
    7516    /home/yu/Linux/206/lseek
    7516    /home/yu/Linux/206/llll/lseek
    1025    /home/yu/Linux/206/llll/x
     348    /home/yu/Linux/206/llll/lseek.c
       0    /home/yu/Linux/206/x
      24    /home/yu/Linux/206/dest
     348    /home/yu/Linux/206/lseek.c
    7820    /home/yu/Linux/206/dirop/dir
    1351    /home/yu/Linux/206/dirop/dir.c

Linux目录遍历实现 -- 列出当前目录下所有文件_第1张图片

你可能感兴趣的:(linux,目录文件遍历)