Linux C 编程之遍历子目录及所有文件

转载自:http://blog.csdn.net/jeff_nie/article/details/8464900

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


子目录流操作相关函数:
DIR *OPENDIR(const char *name);    // 打开路径并建立子目录流,返回子目录流指针
struct dirent *readdir(DIR *dirp);          // 函数返回一个指针,指针指向的结构里保存着子目录流dirp中下一个目录数据项的有关资料。后续的readdir调用将返回后续的目录数据。如果错误或达到了目录尾,将返回NULL值
long int telldir(DIR *dirp);                      // 函数返回值里记录着子目录流里的当前位置
void seekdir(DIR *dirp, long int loc);    // 对dirp指定的子目录流中的目录数据项的指针进行设置。loc的值用来设置指针位置,它应该通过前一个telldir调用获得
int closedir(DIR *dirp);                          // 关闭子目录流,返回关闭操作结果

[cpp]  view plain copy
  1. #include <fcntl.h>             // 提供open()函数  
  2. #include <unistd.h>  
  3. #include <stdio.h>  
  4. #include <dirent.h>            // 提供目录流操作函数  
  5. #include <string.h>  
  6. #include <sys/stat.h>        // 提供属性操作函数  
  7. #include <sys/types.h>         // 提供mode_t 类型  
  8. #include <stdlib.h> 
  9.   
  10. void scan_dir(char *dir, int depth)   // 定义目录扫描函数  
  11.  
  12.     DIR *dp;                      // 定义子目录流指针  
  13.     struct dirent *entry;         // 定义dirent结构指针保存后续目录  
  14.     struct stat statbuf;          // 定义statbuf结构保存文件属性  
  15.     if((dp opendir(dir)) == NULL) // 打开目录,获取子目录流指针,判断操作是否成功  
  16.      
  17.         puts("can't open dir.");  
  18.         return 
  19.      
  20.     chdir (dir);                     // 切换到当前目录  
  21.     while((entry readdir(dp)) != NULL)  // 获取下一级目录信息,如果未否则循环  
  22.      
  23.         lstat(entry->d_name, &statbuf); // 获取下一级成员属性  
  24.         if(S_IFDIR &statbuf.st_mode)    // 判断下一级成员是否是目录  
  25.          
  26.             if (strcmp("."entry->d_name) == || strcmp(".."entry->d_name) == 0)  
  27.               continue 
  28.   
  29.             printf("%*s%s/\n"depth, ""entry->d_name);  // 输出目录名称  
  30.             scan_dir(entry->d_name, depth+4);              // 递归调用自身,扫描下一级目录的内容  
  31.          
  32.         else  
  33.             printf("%*s%s\n"depth, ""entry->d_name);  // 输出属性不是目录的成员  
  34.      
  35.     chdir("..");                                                  // 回到上级目录  
  36.     closedir(dp);                                                 // 关闭子目录流  
  37.  
  38.   
  39.   
  40. int main()  
  41.  
  42.     puts("scan /home:");  
  43.     scan_dir("/home"0);  
  44.     puts("scan over.");  
  45.     return 0;  
  46.  


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值