Linux目录遍历实现 -- 列出当前目录下所有文件 雨点打透心脏的1/2处 2022-08-20 06:23 417阅读 0赞 递归遍历目录,列出目录中的文件,代码: #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); } } closedir(dfd); } /*打印文件信息*/ 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 -------------------- ![这里写图片描述][20160206220109514] [20160206220109514]: /images/20220731/391abeab801548dfb9237fd416de56fd.png
还没有评论,来说两句吧...