首页 > 其他 > 详细

递归遍历目录(很重要,但是我总忘)!

时间:2020-10-05 21:51:14      阅读:41      评论:0      收藏:0      [点我收藏+]
几个需要用到的函数

    1、opendir函数

      DIR *opendir(const char*name);

      参数:一个目录路径,可以是相对也可以绝对;

      返回值:成功返回指向目录结构体的指针,失败返回NULL;

    2、closedir函数,关闭打开的目录。注意写了opendir函数不能忘记closedir

      int closedir(DIR *dirp);

      参数:opendir函数的返回值

      返回值:成功返回0.失败返回-1,设置errno

    3、readdir函数,读目录

      struct dirent *readdir(DIR*dirp);

      参数:opendir返回值

      返回值:成功返回目录项结构体指针,失败返回NULL,设置errno

      struct dirent{

        ino_t d_ino;          //inode编号

        .....

        char d_name[256]; //文件名

      }

    4、stat函数,获取文件属性

      int stat(const char*path,struct stat*buf);

      参数1:文件名

      参数2:传出参数

      返回值:成功返回0,失败返回-1;

      struct stat{

        dev_t st_dev;
        ino_t st_ino;           //inode号
        mode_t st_mode;
        nlink_t st_nlink;      //硬连接数
        uid_t st_uid;           //用户id
        gid st_gid;              //组id
        off_t st_size;
      }
        通过st_mode宏函数来判断:
        S_ISREG(m) 是不是普通文件
      S_ISDIR(m) 是否是目录
      S_ISCHR (m) 是否是字符设备
      S_ISFIFO(m) 管道
      S_ISLNK (m) 符号链接
      S_ISSOCK(m) 套接字

  上代码:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 #include<string.h>
  5 #include<dirent.h>
  6 #include<sys/stat.h>
  7 void IsFile(char*);
  8 //打开目录读取目录
  9 void read_dir(char *dir)
 10 {
 11     char path[256];
 12     DIR*dp;
 13     struct dirent *sdp;
 14     dp=opendir(dir);
 15     if(dp==NULL)
 16     {
 17         perror("opendir error\n");
 18         exit(1);
 19     }
 20 
 21     while((sdp=readdir(dp))!=NULL)
 22     {
 23         if((strcmp(sdp->d_name,".")==0)||(strcmp(sdp->d_name,"..")==0))
 24             continue;
 25         //目录项本身不可访问
 26         sprintf(path,"%s/%s",dir,sdp->d_name);
 27         IsFile(path);  //拼接好带路径的文件名继续判断
 28     }
 29     closedir(dp);//关闭打开的目录
 30 }
 31 void IsFile(char *name)
 32 {
 33     //获取文件属性,判断文件类型
 34     struct stat sbuf;
 35     int ret=stat(name,&sbuf);
 36     if(ret==-1)
 37     {
 38         perror("stat error\n");
 39         exit(1);
 40     }
 41     //是目录文件
 42     if(S_ISDIR(sbuf.st_mode))
 43     {
 44         read_dir(name);
 45     }
 46     //普通文件直接打印
 47     else
 48         printf("%s\t%ld\n",name,sbuf.st_size);
 49     return;
 50 
 51 }
 52 int main(int argc,char *argv[])
 53 {
 54     //先传一个命令行参数
 58     IsFile(argv[1]);
 59  
 60     return 0;
 61 }     

 

递归遍历目录(很重要,但是我总忘)!

原文:https://www.cnblogs.com/xiaoxiaolinux/p/13770570.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!