题目要求:实现函数,完成对指定文件的多层级监控,将目录下的所有文件遍历打印出来。

源代码:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<fcntl.h>
  4 #include<dirent.h>
  5 #include<sys/stat.h>
  6 #include<sys/types.h>
  7 #include<string.h>
  8 #include<unistd.h>
  9 #include<errno.h>
 10 
 11 
 12 int scan_dir(char* dir,int depth)              //扫描目录下文件函数
 13  {
 14     DIR *dp;           //定义目录流指针
 15     struct dirent* entry;  //定义dirent 结构体指针
 16     struct stat statbuf;   //定义statbuf保存文件属性
 17 
 18     //打开目录
 19    dp = opendir(dir);
 20    if(dp == NULL)
 21    {
 22        printf("打开目录失败:%s\n",strerror(errno));
 23        return -1;
 24    }
 25 
 26    chdir(dir);          //切换到当前目录去获取下一级
 27    while((entry = readdir(dp)) != NULL)
 28    {
 29        lstat(entry->d_name,&statbuf);   //获取下一级成员属性
 30        if(S_IFDIR & statbuf.st_mode)    //判断下一级成员是否为目录
 31        {
 32            if(!strcmp(entry->d_name,".") == 0 || !strcmp(entry->d_name,"..")==0)  //剔除 .和 .. 文件
 33            {
 34                continue;
 35            }
 36            printf("%*s%s/\n",depth,"",entry->d_name);   //输出目录名称
 37            scan_dir(entry->d_name,depth+4);      //递归调用,扫描下一级目录
 38 
 25 
 26    chdir(dir);          //切换到当前目录去获取下一级
 27    while((entry = readdir(dp)) != NULL)
 28    {
 29        lstat(entry->d_name,&statbuf);   //获取下一级成员属性
 30        if(S_IFDIR & statbuf.st_mode)    //判断下一级成员是否为目录
 31        {
 32            if(!strcmp(entry->d_name,".") == 0 || !strcmp(entry->d_name,"..")==0)  //剔除 .和 .. 文件
 33            {
 34                continue;
 35            }
 36            printf("%*s%s/\n",depth,"",entry->d_name);   //输出目录名称
 37            scan_dir(entry->d_name,depth+4);      //递归调用,扫描下一级目录
 38 
 39        }
 40        else
 41        {
 42            printf("%*s%s\n",depth,"",entry->d_name);  //输出属性不是目录的成员
 43        }
 44    }
 45 
 46     closedir(dp);    //关闭子目录流
 47     return 0;
 48 }
 49 
 50 
 51 
 52 int main()
 53 {
 54     puts("扫描目录:");
 55     scan_dir("./",0);            //可自定义要扫描的路径, ./表示当前目录
 56     puts("扫描结束!");
 57     return 0;
 58 }

       该函数的作用是遍历目录,将指定路径下的 所有子目录和文件输出到终端上。遍历子目录使用的方法是递归调用,首先,判断子目录流指针所指向的文件是否为目录文件。如果是,该函数将调用自身去遍历子目录;如果不是则输出文件名称,继续遍历当前目录,直到子目录流指向NULL。函数中参数 dir 为路径,指定需要遍历的文件路径,depth参数的作用是在子目录前增加空格的数量,每一轮递归都将增加4个空格,这样个容易显示出目录的层次。

Logo

更多推荐