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