linux

Linux readdir与scandir函数的对比

小樊
53
2025-08-08 08:17:07
栏目: 智能运维

readdirscandir 是 Linux 系统中用于读取目录内容的两个函数。它们有一些相似之处,但也存在一些关键差异。以下是这两个函数的对比:

readdir

函数原型:

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

功能:

特点:

  1. 简单易用:API 相对简单,易于理解和使用。
  2. 顺序读取:按目录中的顺序返回条目。
  3. 不支持过滤:无法直接在读取时进行过滤或排序。
  4. 性能:对于大型目录,性能可能不如 scandir

示例代码:

DIR *dir = opendir("/path/to/directory");
if (dir == NULL) {
    perror("opendir");
    return 1;
}

struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
    printf("%s\n", entry->d_name);
}

closedir(dir);

scandir

函数原型:

#include <dirent.h>

int scandir(const char *dir, struct dirent ***namelist, int (*filter)(const struct dirent *), int (*compar)(const void *, const void *));

功能:

特点:

  1. 灵活性高:支持自定义过滤和排序逻辑。
  2. 一次性读取:可以一次性获取所有条目,便于后续处理。
  3. 性能优化:对于大型目录,通常比 readdir 更高效。
  4. 内存管理:需要手动释放返回的数组和每个 dirent 结构的内存。

示例代码:

int compare(const void *a, const void *b) {
    return strcmp(((struct dirent **)a)[0]->d_name, ((struct dirent **)b)[0]->d_name);
}

int filter(const struct dirent *entry) {
    return entry->d_type == DT_REG; // 只返回普通文件
}

struct dirent **namelist;
int n = scandir("/path/to/directory", &namelist, filter, compare);
if (n < 0) {
    perror("scandir");
    return 1;
}

for (int i = 0; i < n; i++) {
    printf("%s\n", namelist[i]->d_name);
}

qsort(namelist, n, sizeof(struct dirent *), compare);
for (int i = 0; i < n; i++) {
    printf("%s\n", namelist[i]->d_name);
}

free(namelist);

总结

选择哪个函数取决于具体的应用需求和性能考虑。

0
看了该问题的人还看了