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

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

#include
#include
#include
#include
#include
#include
#include
#include
#include
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 \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;
}

    最后在附上程序运行结果的截图:

在linux下用C语言实现递归查看某个目录中的所有文件_第1张图片

    不完善的地方:

    这个程序还有不完善的地方就是不能像ls -R 那样先将一个目录下所有文件都输出完了,在去输出子目录下的文件,在我这个程序中,如果目录中还有目录,那么就会继续深入这个目录,直到把这个目录中的所有文件都遍历完了,才能返回继续输出!

    刚刚把程序改了一点,就是那个stat和opendir出错的时候,不应该直接exit,而是调用return返回上一层的函数!还有关闭目录失败的时候,也不应该直接退出!还有就是遍历完一个目录之后调用一句p[-1]=0;这样让fullpath的名字还是保持原来的样子!


   最后,强烈建议大家读一下《Unix环境高级编程》的程序清单4-7,我感觉那简直就是神级代码。我这里好多思路都是来源于那个代码,相比stevens这位大神的代码,我这简直显得太过小儿科了!


你可能感兴趣的:(Unix编程)