在linux下用C语言实现递归查看某个目录中的所有文件
2014-11-16 10:06
501 查看
在看APUE的时候看到程序清单4-7能够统计一个目录下的各种文件的数量!了解了这个程序之后,我在此基础上也写了一个程序,查看某个目录下的所有文件,并输出出来,类似与ls -R 命令!代码如下:
最后在附上程序运行结果的截图:
![](http://img.blog.csdn.net/20141116214502196?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjI5MTM5Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
不完善的地方:
这个程序还有不完善的地方就是不能像ls -R 那样先将一个目录下所有文件都输出完了,在去输出子目录下的文件,在我这个程序中,如果目录中还有目录,那么就会继续深入这个目录,直到把这个目录中的所有文件都遍历完了,才能返回继续输出!
刚刚把程序改了一点,就是那个stat和opendir出错的时候,不应该直接exit,而是调用return返回上一层的函数!还有关闭目录失败的时候,也不应该直接退出!还有就是遍历完一个目录之后调用一句p[-1]=0;这样让fullpath的名字还是保持原来的样子!
最后,强烈建议大家读一下《Unix环境高级编程》的程序清单4-7,我感觉那简直就是神级代码。我这里好多思路都是来源于那个代码,相比stevens这位大神的代码,我这简直显得太过小儿科了!
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<errno.h> #include<dirent.h> #include<sys/types.h> #include<sys/stat.h> #include<unistd.h> #include<limits.h> char *fullpath; int readfile(char *k) { DIR * dp; struct dirent * dirrp; struct stat buf; //创建一个p指针指向fullpath的最末尾 char *p; p = fullpath + strlen(fullpath); if(-1 == lstat(fullpath,&buf)) { printf("%s[lstat]%s\n",fullpath,strerror(errno)); return -1; } //***************如果不是目录文件则返回********************************// if(S_ISDIR(buf.st_mode)==0) { printf("%s ",k); return 1; } //***************如果是目录文件则继续********************************// //如果是目录且在尾部没有/符号,那么就在这个文件名尾部加一个/符号 if('/' != *(p-1)) { *p++ = '/'; *p = 0; } //输出这个目录 printf("%s:\n",fullpath); if(NULL == (dp=opendir(fullpath))) { printf("%s[opendir]%s\n",fullpath,strerror(errno)); return -1; } while(NULL != (dirrp=readdir(dp))) { //将目录下的..和.文件忽略 if((strcmp(dirrp->d_name,".")==0) || (strcmp(dirrp->d_name,"..")==0)) continue; strcpy(p,dirrp->d_name); if(0 == readfile(p)) //遍历完一个目录文件 printf("\n"); } p[-1]=0; //将后面递归增加的名称全部去掉 if( -1 == closedir(dp)) { printf("%s[closedir]%s\n",fullpath,strerror(errno)); return -1; } return 0; } int main(int argc,char *argv[]) { if(argc != 2) { printf("Usage:%s <Dir name>\n",argv[0]+2); exit(EXIT_FAILURE); } //最终文件的路径是保存在fullpath中的,这里对fullpath进行了初始化 fullpath = (char *)malloc(sizeof(char)*PATH_MAX); memset(fullpath,0,PATH_MAX); strcpy(fullpath,argv[1]); readfile(fullpath); printf("\n"); return 0; }
最后在附上程序运行结果的截图:
不完善的地方:
这个程序还有不完善的地方就是不能像ls -R 那样先将一个目录下所有文件都输出完了,在去输出子目录下的文件,在我这个程序中,如果目录中还有目录,那么就会继续深入这个目录,直到把这个目录中的所有文件都遍历完了,才能返回继续输出!
刚刚把程序改了一点,就是那个stat和opendir出错的时候,不应该直接exit,而是调用return返回上一层的函数!还有关闭目录失败的时候,也不应该直接退出!还有就是遍历完一个目录之后调用一句p[-1]=0;这样让fullpath的名字还是保持原来的样子!
最后,强烈建议大家读一下《Unix环境高级编程》的程序清单4-7,我感觉那简直就是神级代码。我这里好多思路都是来源于那个代码,相比stevens这位大神的代码,我这简直显得太过小儿科了!
相关文章推荐
- linux下c语言实现搜索根目录下所有文件
- 如何使用c语言递归地列出linux系统的所有目录和文件
- Linux下c语言实现将一个目录下的所有文件和目录复制到另一个目录下
- linux-C实现查看目录中所有文件
- linux目录下的所有文件批量创建链接(但目录不链接)的实现方法
- C语言 递归地删除一个指定目录下所有指定类型的文件
- Linux命令:递归删除目录下所有exe文件
- linux下递归删除目录下所有指定的文件
- linux下递归删除目录下所有exe文件
- Linux 递归替换目录下所有文件里的字符串
- 递归遍历Linux下的目录文件源码实现
- linux下递归遍历目录下的文件,实现批量替换
- 写了一个递归查看目录下所有,文件…
- Linux下 查看当前目录的所有文件
- Linux通过shell实现递归列目录及对文件的处理
- 面试题-程序题-Java递归实现遍历文件目录(所有文件夹和子文件)
- linux下递归查找某目录下所有文件包含某字符串的命令
- linux下递归删除目录下所有指定类型文件
- php中通过递归实现删除目录下的所有文件。
- linux下使用c语言删除指定目录下所有文件