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