C语言通过文件名在Linux上当前目录及子目录中查找

本文主要介绍Linux上,使用C语言在当前目录及其子目录中为该文件提供文件名搜索。并且打印包含该文件的子目录的名称。

1、Linux C用到相关函数说明

1)DIR* opendir (const char * path );

头文件

#include<sys/types.h>

#include<dirent.h>

说明

打开一个目录,在失败的时候返回一个空的指针。

2)struct dirent * readdir(DIR * dir);

头文件

#include <sys/types.h>   

#include <dirent.h>

说明

readdir()返回参数dir 目录流的下个目录进入点。结构dirent 定义如下:

struct dirent

{

    ino_t d_ino; //d_ino 此目录进入点的inode

    ff_t d_off; //d_off 目录文件开头至此目录进入点的位移

    signed short int d_reclen; //d_reclen _name 的长度, 不包含NULL 字符

    unsigned char d_type; //d_type d_name 所指的文件类型 d_name 文件名

    har d_name[256];

};

3)int strcmp(const char* stri1,const char* str2);

头文件

#include <string.h>   

说明

strcmp() 会根据 ASCII 编码依次比较 str1 和 str2 的每一个字符,直到出现不到的字符,或者到达字符串末尾(遇见\0)。

返回值:

1)如果返回值 < 0,则表示 str1 小于 str2。

2)如果返回值 > 0,则表示 str2 小于 str1。

3)如果返回值 = 0,则表示 str1 等于 str2。


4)int closedir(DIR *dir);

头文件

#include<sys/types.h>

#include<dirent.h>

说明

closedir()关闭参数dir所指的目录流。

返回值 关闭成功则返回0,失败返回-1,错误原因存于errno 中。

错误代码 EBADF 参数dir为无效的目录流。


2、当前目录及其子目录查找文件名

在当前目录及其子目录中为该文件提供文件名搜索。应打印包含该文件的子目录的名称。代码如下,

#include <dirent.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>

void listDir(const char *path, const char *name) {
    DIR *dir;
    struct dirent *ent;
    if ((dir = opendir(path)) != NULL) {
        while ((ent = readdir(dir)) != NULL) {
            if (ent->d_type == DT_REG && !strcmp(name, ent->d_name)) {
                printf("%s\n", path);
            }
            if (ent->d_type == DT_DIR && strcmp(ent->d_name, ".")
                                      && strcmp(ent->d_name, "..")) {
                char *subdir;
                size_t len = strlen(path);
                const char *sep = "/";
                if (len && path[len - 1] == '/')
                    sep++;
                if (asprintf(&subdir, "%s%s%s", path, sep, ent->d_name) > 0) {
                    listDir(subdir, name);
                    free(subdir);
                }
            }
        }
        closedir(dir);
    }
}
int main(int argc, char *argv[]) {
    listDir("/", "a.out");
    return 0;
}

推荐阅读
cjavapy编程之路首页