扫描目录和扫描文件一样,目录其实也是一个文件,首先用opendir
打开需要执行的目录它的形参是目录名,opendir
会返回一个指向目录a的DIR类型的指针该结构体指针内包含了目录级别、文件描述符等可用来访问目录的信息。将该指针作为readdir
函数的形参可以访问目录的索引信息。通过dirent
中的文件名和路径可以使用lstat访问链接信息
#include"sys/types.h"
#include"dirent.h"
#include"stdio.h"
#include"string.h"
#include"sys/stat.h"
#include"unistd.h"
void printdir (char *dir,int depth) //输出文件目录,
{
DIR *dp;
struct dirent *entry;
struct stat statbuf;
if((dp = opendir(dir))==NULL) //打开目录,返回目录数据
{
perror("opendir: ");
return ;
}
chdir(dir); //cd命令,切换当当前工作目录
while((entry=readdir(dp))!=NULL)
{
lstat(entry->d_name,&statbuf);
if(S_ISDIR(statbuf.st_mode)) //判断一个路径是否是目录
{
if(strcmp(".",entry->d_name)==0||strcmp("..",entry->d_name)==0) //判断目录是否是当前目录和上级目录是就跳过
continue;
printf("%*s%s/\n",depth,":",entry->d_name); //输出目录名,使用:占位对其
printdir(entry->d_name,depth+4); //
}
// else printf("%*s%s\n,",depth," ",entry->d_name); //输出目录下所有文件
}
chdir("..");
closedir(dp); //及时关闭,目录也会占用描述符
}
int main() //显示当前输入目录的所有子目录信息depth为打印时缩进长度
{
int depth=0;
char *pwd;
printf("please input depth(1):");
scanf(" %d",&depth);
printf("please input pwd(/home):");
scanf(" %s",pwd);
printf("Diretory scan of %s:\n",pwd);
printdir(pwd,depth);
printf("done.\n");
exit(0);
}
主要功能的实现都是在printdir
函数中实现的,用opendir
函数检查指定目录是否存在后调用chdir
进入目录,如果readdir
函数返回值不为空,程序就减产该数据项是否是一个空目录,如果是就根据depth
打印出来,并对这个目录进行遍历,跳过了.
和..
选项;