您的位置:首页 > 运维架构 > Linux

在linux下用C语言实现递归查看某个目录中的所有文件

2014-11-16 10:06 501 查看
在看APUE的时候看到程序清单4-7能够统计一个目录下的各种文件的数量!了解了这个程序之后,我在此基础上也写了一个程序,查看某个目录下的所有文件,并输出出来,类似与ls -R 命令!代码如下:

#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这位大神的代码,我这简直显得太过小儿科了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: