readdir 和 scandir 是在 CentOS(以及其他类 Unix 系统)上用于读取目录内容的两个函数。它们都提供了遍历目录并获取目录项信息的功能,但在实现和使用上有一些区别。
readdir 是一个较旧的函数,定义在 <dirent.h> 头文件中。它通常与 opendir 和 closedir 一起使用来读取目录。
函数原型:
struct dirent *readdir(DIR *dirp);
参数:
dirp:指向 DIR 类型的指针,该指针通过 opendir 函数打开一个目录得到。返回值:
struct dirent 结构的指针,该结构包含了目录项的信息。NULL。特点:
readdir 返回的 struct dirent 结构中的 d_name 字段包含了目录项的名称。readdir 不保证返回的目录项顺序。readdir 在每次调用时都会从上次读取的位置继续,因此通常需要使用一个循环来遍历整个目录。scandir 是一个较新的函数,定义在 <dirent.h> 头文件中(在某些系统上可能需要包含 <sys/types.h>)。它提供了更多的功能和灵活性。
函数原型:
int scandir(const char *name, struct dirent ***namelist, int (*cmp)(const void *, const void *), int (*dcmp)(const void *, const void *));
参数:
name:要扫描的目录路径。namelist:一个指向指针数组的指针,该数组将用于存储目录项的 struct dirent 结构指针。cmp:一个可选的比较函数,用于对 namelist 中的目录项进行排序。dcmp:一个可选的比较函数,用于对目录项进行自定义排序。返回值:
. 和 ..)。-1。特点:
scandir 返回一个动态分配的数组,其中包含了目录中的所有条目(不包括 . 和 ..)。scandir 允许使用自定义的比较函数对目录项进行排序。scandir 返回的数组需要在使用完毕后通过 free 函数释放内存。readdir 更简单,适用于不需要排序或自定义比较函数的场景。scandir 提供了更多的功能,包括排序和自定义比较函数,但使用起来稍微复杂一些。scandir 返回的数组需要手动释放内存,而 readdir 不需要。在选择使用哪个函数时,可以根据具体需求和偏好来决定。如果需要更多的控制和灵活性,可以选择 scandir;如果只需要基本的目录遍历功能,readdir 可能是一个更简单的选择。