C/C++ 中获取目录中的文件列表

C/C++ 中,获取目录中的文件列表需要借助操作系统提供的 API。不同操作系统提供的 API 稍有差异,对于大目录,遍历文件可能会比较耗时。可以考虑使用多线程或异步 I/O 来提高性能。C++17 及以上,推荐使用 <filesystem> 头文件,代码简洁且功能强大。

1、 使用 C 获取目录中的文件

在 C 中,最常用的方法是使用 opendir()readdir()closedir() 函数,这些函数是 POSIX 库的一部分(在类 Unix 系统如 Linux 和 macOS 上可用)。对于 Windows,你可以使用 FindFirstFileFindNextFile 等函数。

1)类 Unix 系统(Linux、macOS)

#include <stdio.h>
#include <dirent.h>
#include <stdlib.h>

int main() {
    DIR *dir;
    struct dirent *entry;
    
    // 打开目录
    dir = opendir(".");
    if (dir == NULL) {
        perror("opendir");
        return 1;
    }
    
    // 读取目录
    while ((entry = readdir(dir)) != NULL) {
        // 打印每个文件/目录的名称
        printf("%s\n", entry->d_name);
    }
    
    // 关闭目录
    closedir(dir);
    
    return 0;
}

2)Windows系统

#include <stdio.h>
#include <windows.h>

int main() {
    WIN32_FIND_DATA findFileData;
    HANDLE hFind = FindFirstFile("C:\\path\\to\\your\\directory\\*", &findFileData);
    
    if (hFind == INVALID_HANDLE_VALUE) {
        printf("打开目录失败。\n");
        return 1;
    }

    do {
        // 打印文件名
        printf("%s\n", findFileData.cFileName);
    } while (FindNextFile(hFind, &findFileData) != 0);

    // 关闭句柄
    FindClose(hFind);
    
    return 0;
}

2、使用 C++ 获取目录中的文件

在 C++ 中,最直接的方式是使用 C++17 引入的文件系统库,它提供了一个简洁的接口来处理文件系统操作。

#include <iostream>
#include <filesystem>

namespace fs = std::filesystem;

int main() {
    std::string path = "."; // 当前目录
    
    // 遍历目录中的文件
    for (const auto &entry : fs::directory_iterator(path)) {
        std::cout << entry.path() << std::endl;
    }

    return 0;
}

3、使用 POSIX(类 Unix 系统)中的 C++ 代码

对于支持 POSIX 的系统,也可以像 C 一样使用 opendir()readdir()closedir() 函数,只不过是用 C++ 编写。

#include <iostream>
#include <dirent.h>
#include <cstdlib>

int main() {
    DIR *dir;
    struct dirent *entry;
    
    // 打开目录
    dir = opendir(".");
    if (dir == nullptr) {
        perror("opendir");
        return 1;
    }
    
    // 读取目录
    while ((entry = readdir(dir)) != nullptr) {
        // 打印每个文件/目录的名称
        std::cout << entry->d_name << std::endl;
    }
    
    // 关闭目录
    closedir(dir);
    
    return 0;
}

推荐阅读
cjavapy编程之路首页