linux c 目录操作函数 opendir closedir readdir 简介

在Linux环境下,有时候需要编写一些实用的工具,比如检索功能,最近在做病毒查杀应用开发,涉及到批量扫描指定目录下文件,

因为要测试大量病毒文件,该部分功能又是要通过API集成到其他应用软件中,设计时采用单个文件扫描,但是自己测试文件另写工具

文件量太大不可能手动一个一个测试,还厚Linux下有现成的关于目录的库函数,于是就动手添加了关于获取目录文件的代码;

1)打开指定目录opendir得到目录句柄;

2)然后通过while循环不断readdir获取目录的内容,并存储到struct dirent 结构体变量中;

3)获取该结构体变量的成员函数d_name就得到了待扫描的文件,然后在使用sprintf函数加入文件绝对路径,就可以调用API进行扫描了;

4)最后关闭目录句柄closedir。

---------------------------------------------------------

opendir原型:

DIR *opendir(const char *path);

DIR *dirp;      //接受打开目录句柄

返回值:NULL  打开目录失败

---------------------------------------------------------

readdir原型:

struct dirent *dir_entry;    //存储获取的目录内容

struct dirent *readdir(DIR *dirp);

返回值:NULL   获取目录内容失败或者目录内容已经全部读取完成 ;

---------------------------------------------------------

closedir原型:

int closedir(DIR *dirp);

返回值:0正常     -1错误

---------------------------------------------------------

关于struct dirent结构体主要注意两个成员即可,若有特殊情况特殊处理:

struct dirent
  {
#ifndef __USE_FILE_OFFSET64
    __ino_t d_ino;                  // 此目录进入点的inode
    __off_t d_off;                  // 目录文件开头到此目录进入点的位移
#else
    __ino64_t d_ino;
    __off64_t d_off;
#endif
    unsigned short int d_reclen;    // _name的长度,不包含NULL字符
    unsigned char d_type;           // d_name所指的文件类型
    char d_name[256];               // 文件名
  };

主要关注d_name(文件名)和d_type(文件类型),关于文件名就不在多说就是返回文件名字符串,而文件类型则分为两类
普通文件和文件夹,%d显示的值4代表目录,8代表文件,也就是通过dir_entry->d_type直接与4或者8比较作为if判断条件

从而可以实现遍历主目录下所有文件包括子目录,关于目录的操作基本这些,更深入的根据不同情况来定,下面看一下简单

示例代码:

#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>

int main(int argc, char **argv)
{
    undefined
    DIR *dirp = NULL;
    struct dirent *dir_entry = NULL;
    char namebuf[100] = {0};
    if (argc != 2)
    {
        undefined
        printf("Error! Usage:%s [dirpath]\n", __func__);         // 提示使用规则  可执行程序  +   目录
                                                   
        return -1;
    }
    if ((dirp = opendir(argv[1])) == NULL)
    {
        undefined
        printf("Opendir %s fail!\n", argv[1]);
        return -1;
    }
    while ((dir_entry = readdir(dirp)) != NULL)
    {
        undefined
        sprintf(namebuf, "xxx/xxx/xx/%s", dir_entry->d_name);   // 这里可以根据实际情况处理,若是需要遍历整个目录,只需要从
                                                         
            xxx;                                                // main函数中剥离打开目录并获取和关闭的功能,通过递归实现
                                                                                                   
        ... .....
    }
    closedir(dirp);
}


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值