开发手册 欢迎您!
软件开发者资料库

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

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

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

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

头文件

#include

#include

说明

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

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

头文件

#include   

#include

说明

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   

说明

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

返回值:

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

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

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


4)int closedir(DIR *dir);

头文件

#include

#include

说明

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

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

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


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

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

#include #include #include #include #include #include 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;}