发布于2026-07-12 阅读(0)
扫一扫,手机访问
说到跨平台目录读取,很多开发者在切换操作系统时都会遇到一个问题:readdir 在 POSIX 系统上是标准操作,可一到 Windows 就水土不服。其实解决方案很简单——用条件编译把两套 API 拆开处理。下面这段 C++ 代码就演示了如何在同一份源码里兼容 Windows 和 Unix-like 环境。

#include
#include
#ifdef _WIN32
#include
#else
#include
#include
#include
#include
#endif
void list_directory_contents(const std::string& path) {
#ifdef _WIN32
WIN32_FIND_DATA find_data;
HANDLE h_find = FindFirstFile((path + "\\*").c_str(), &find_data);
if (h_find == INVALID_HANDLE_VALUE) {
std::cerr << "Error: Cannot open directory." << std::endl;
return;
}
do {
std::cout << find_data.cFileName << std::endl;
} while (FindNextFile(h_find, &find_data) != 0);
FindClose(h_find);
#else
DIR* dir = opendir(path.c_str());
if (dir == nullptr) {
std::cerr << "Error: Cannot open directory." << std::endl;
return;
}
struct dirent* entry;
while ((entry = readdir(dir)) != nullptr) {
std::cout << entry->d_name << std::endl;
}
closedir(dir);
#endif
}
int main() {
std::string path = "."; // 当前目录
list_directory_contents(path);
return 0;
}
这里的核心函数 list_directory_contents 接受一个路径字符串,然后根据编译目标平台选择不同的底层实现。在 Windows 上,借助 FindFirstFile 和 FindNextFile 遍历目录;在其他平台,则直接用 opendir 和 readdir。两种分支都做了错误处理——如果目录打不开,会输出错误信息并直接返回,避免空指针或死循环。
编译时要注意工具链的选择:Windows 下推荐 Visual Studio 或者 MinGW(支持 Windows API 的编译器),Linux/macOS 上直接用 GCC 或 Clang 就行,CMake 也能自动处理平台宏。话说回来,这其实只是一个最基础的封装,实际项目中可能还需要过滤掉 . 和 ..,或者支持递归遍历,但套路是一样的——预处理宏是跨平台编程的保底方案。
下一篇:GCC编译失败原因是什么
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8