一个Linux目录扫描程序

该程序实现了一个递归遍历目录的功能,通过`opendir`、`readdir`和`lstat`系统调用获取并打印目录及其子目录下的文件信息。它首先检查指定目录是否存在,然后遍历目录,对每个条目判断是否为目录,如果是目录则继续递归遍历,同时忽略`.`和`..`。程序还提供了输入目录深度和路径的功能。
摘要由CSDN通过智能技术生成

​ 扫描目录和扫描文件一样,目录其实也是一个文件,首先用opendir打开需要执行的目录它的形参是目录名,opendir会返回一个指向目录a的DIR类型的指针该结构体指针内包含了目录级别、文件描述符等可用来访问目录的信息。将该指针作为readdir函数的形参可以访问目录的索引信息。通过dirent中的文件名和路径可以使用lstat访问链接信息

Created with Raphaël 2.2.0 打开一个目录a,返回指向目录a的DIR结构体dp 读取目录a下所欲文件,返回dirent结构体entry 遍历结构体entry获取每个文件详细信息,存储在stat中 输出目录信息 结束
#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打印出来,并对这个目录进行遍历,跳过了...选项;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值