📜  在 C++ 中遍历文件系统(1)

📅  最后修改于: 2023-12-03 14:50:52.432000             🧑  作者: Mango

在 C++ 中遍历文件系统

在 C++ 编程中,需要遍历文件系统的场景很常见。无论是查找特定类型的文件,还是列出目录中的所有文件,C++ 提供了多种方法来处理文件系统中的文件和目录。

使用 <filesystem> 标准库

C++17 引入了 <filesystem> 标准库,它提供了简单而强大的文件系统操作功能。下面是一个使用该库遍历文件系统的示例代码:

#include <iostream>
#include <filesystem>

namespace fs = std::filesystem;

void TraverseFileSystem(const fs::path& path)
{
    for (const auto& entry : fs::recursive_directory_iterator(path))
    {
        if (entry.is_regular_file())
        {
            std::cout << "File: " << entry.path().filename().string() << std::endl;
        }
        else if (entry.is_directory())
        {
            std::cout << "Directory: " << entry.path().filename().string() << std::endl;
        }
    }
}

int main()
{
    fs::path pathToTraverse = "/path/to/directory";
    TraverseFileSystem(pathToTraverse);

    return 0;
}

在上面的代码中,我们首先包含了 <iostream><filesystem> 头文件,并使用 std::filesystem 命名空间来简化代码。然后,我们定义了一个名为 TraverseFileSystem 的函数,该函数接受一个 path 参数,表示要遍历的目录。

TraverseFileSystem 函数中,我们使用 fs::recursive_directory_iterator 对给定路径进行递归遍历。对于每个遍历得到的 entry,我们可以使用 is_regular_fileis_directory 函数判断其类型。通过 entry.path() 可以获取文件或目录的完整路径,通过 filename() 可以获取仅包含文件名或目录名的部分。

main 函数中,我们定义了要遍历的目录路径 pathToTraverse,并将其传递给 TraverseFileSystem 函数进行遍历。这里只是简单地打印出文件或目录的名称,你可以根据实际需求进行相应的处理。

跨平台的解决方案

需要注意的是,<filesystem> 标准库在 C++17 之前的 C++ 版本中不可用。如果你的项目需要支持 C++17 之前的标准,那么你可以考虑使用跨平台的文件系统库,如 Boost.FileSystem。

Boost 文件系统库提供了与 <filesystem> 类似的功能,可以在多个平台上使用。以下是使用 Boost 文件系统库遍历文件系统的示例代码:

#include <iostream>
#include <boost/filesystem.hpp>

namespace fs = boost::filesystem;

void TraverseFileSystem(const fs::path& path)
{
    for (const auto& entry : fs::recursive_directory_iterator(path))
    {
        if (fs::is_regular_file(entry.path()))
        {
            std::cout << "File: " << entry.path().filename().string() << std::endl;
        }
        else if (fs::is_directory(entry.path()))
        {
            std::cout << "Directory: " << entry.path().filename().string() << std::endl;
        }
    }
}

int main()
{
    fs::path pathToTraverse = "/path/to/directory";
    TraverseFileSystem(pathToTraverse);

    return 0;
}

这里的代码与使用 <filesystem> 标准库的代码非常相似,只是包含的头文件变为了 <boost/filesystem.hpp>,并且使用了 boost::filesystem 命名空间。

总结

无论是使用 <filesystem> 标准库,还是 Boost 文件系统库,C++ 提供了丰富的功能来遍历文件系统。通过遍历文件系统,你可以方便地查找文件、处理目录结构,以及执行其他与文件系统相关的操作。以上代码示例可以帮助你开始在 C++ 中进行文件系统遍历。