readdir 和 opendir 是两个用于读取目录内容的函数,分别属于 POSIX 标准(在 Unix-like 系统如 Linux 中使用)和 Windows API。尽管它们的功能相似,但在实现和使用上存在一些差异。
平台差异:
readdir 是 POSIX 标准的一部分,因此在所有遵循 POSIX 标准的系统上都可以使用,包括 Linux、macOS 等。opendir 是 Windows API 的一部分,因此只能在 Windows 系统上使用。头文件:
readdir 需要包含 <dirent.h> 头文件。opendir 需要包含 <dirent.h> 或 <io.h> 头文件(取决于具体的编译器和环境)。数据类型:
readdir 返回一个指向 struct dirent 结构的指针,该结构包含了目录项的信息,如文件名、inode 号等。opendir 返回一个指向 DIR 类型的指针,该类型表示一个打开的目录流。目录项的信息通过 readdir 函数从这个目录流中读取。错误处理:
readdir 中,如果发生错误,它会返回 NULL,并且可以通过检查全局变量 errno 来获取具体的错误信息。opendir 中,如果发生错误,它也会返回 NULL,但错误信息通常需要通过调用 GetLastError 函数来获取。使用示例:
使用 readdir 的示例(Linux/macOS):
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <errno.h>
int main() {
DIR *dir;
struct dirent *entry;
dir = opendir(".");
if (dir == NULL) {
perror("opendir");
exit(EXIT_FAILURE);
}
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
使用 opendir 和 readdir 的示例(Windows):
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <io.h>
#include <sys/types.h>
#include <sys/stat.h>
int main() {
WIN32_FIND_DATA findFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;
char searchPath[MAX_PATH];
// 构建搜索路径,例如 "C:\\*.*"
sprintf(searchPath, "%s\\*.*", "C:\\");
hFind = FindFirstFile(searchPath, &findFileData);
if (hFind == INVALID_HANDLE_VALUE) {
printf("FindFirstFile failed with error: %d\n", GetLastError());
return 1;
}
do {
printf("%s\n", findFileData.cFileName);
} while (FindNextFile(hFind, &findFileData) != 0);
FindClose(hFind);
return 0;
}
注意:在 Windows 示例中,我们使用了 FindFirstFile 和 FindNextFile 函数来遍历目录,而不是直接使用 opendir 和 readdir。这是因为 Windows API 没有直接提供类似于 POSIX 的 opendir 和 readdir 函数。然而,你仍然可以使用 opendir 和 readdir 在 Windows 上编写可移植的代码,只需确保在编译时定义了 _WIN32 宏即可。