readdir 和 scandir 是 Linux 系统中用于读取目录内容的两个函数。它们有一些相似之处,但也存在一些关键差异。以下是这两个函数的对比:
函数原型:
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
功能:
dirp 中读取下一个目录项。dirent 结构的指针,该结构包含目录项的信息。特点:
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);
函数原型:
#include <dirent.h>
int scandir(const char *dir, struct dirent ***namelist, int (*filter)(const struct dirent *), int (*compar)(const void *, const void *));
功能:
dir 中的所有条目,并将其存储在一个动态分配的数组中。filter 函数过滤条目,通过 compar 函数排序条目。特点:
readdir 更高效。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);
readdir:适用于简单的目录读取任务,不需要复杂的过滤或排序逻辑。scandir:适用于需要高效处理大量目录项或需要自定义过滤和排序的场景。选择哪个函数取决于具体的应用需求和性能考虑。