用到函数:
此相关函数被封装在头文件direnth.h里,他们使用一个名为DIR的结构作为子目录处理基础,这个结构的指针所指向的内存空间被称为子目录流。
DIR *opendir(const char *name); | 打开路径并建立子目录流,返回子目录流指针 |
struct dirent *readdir(DIR *dirp); | 函数返回一个指针,指针指向结构里保存的子目录流 dirp 中下 一个目录数据项的有关资料。后续的readdir调用将返回后续的目录数据。如果错误或达到目录尾,将返回NULL; |
long int telldir (DIR *dorp) | 函数返回值里记录着子目录流的当前位置 |
void seekdir(DIR *dirp,long int loc) | 对dirp指定的子目录流中的目录数据项的指针进行设置,loc的值用来设置指针的位置,它应该通过一个telldir调用获得 |
int closedir(DIR * dirp) | 关闭字目录流,返回关闭操作结果 |
#include <stdio.h>
#include <dirent.h> // 提供目录流操作函数
#include <string.h>
#include <stdlib.h>
void scan_dir(char *dir, int depth) // 定义目录扫描函数
{
DIR *dp; // 定义子目录流指针
struct dirent *entry; // 定义dirent结构指针保存后续目录
struct stat statbuf; // 定义statbuf结构保存文件属性
if((dp = opendir(dir)) == NULL) {// 打开目录,获得子目录流指针,判断操作
// 是否成功
puts("无法打开该目录");
return;
}
chdir(dir); // 切换到当前目录中去
while((entry = readdir(dp)) != NULL) { // 获取下一级目录信息,如
// 束则循环果未结
lstat(entry->d_name, &statbuf); // 获取下一级成员属性
if(S_IFDIR & statbuf.st_mode) { // 判断下一级成员是否是目录
if(strcmp(".", entry->d_name) == 0 || strcmp("..", entry->d_name) == 0)
continue; // 如果获得的成员是符号“.”和“..”,
// 跳过本次循环
printf("%*s%s/\n",depth,"",entry->d_name); // 输出目录名称
scan_dir(entry->d_name,depth+4);// 递归调用自身,扫描下一级目录的内容
}
else
printf("%*s%s\n", depth, "", entry->d_name); // 输出属性不是目录
// 的
成员
}
chdir(".."); // 回到上一级目录
closedir(dp); // 关闭子目录流
}
int main ()
{ puts("扫描/boot目录");
scan_dir("/boot",0);
printf("endl;\n");
return 0;
}