windows10 上 recursive_directory_iterator 的意外行为

问题描述 投票:0回答:1

我有一个函数在 Windows 10 上遇到挂起问题,但在 Linux 上运行顺利。有问题的代码行似乎是

bfs::recursive_directory_iterator it(dirPath)
。此后,不会再执行任何代码。

但是,当我用

boost::filesystem
替换
std::filesystem
时,一切都会按预期进行。谁能解释为什么会出现这种行为?

我使用的是Boost版本1.82。

这是有问题的函数:

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

namespace bfs = boost::filesystem;

void listFilesRecursive(const bfs::path &dirPath, std::vector<std::string> &filePaths)
{
    // Convert dirPath to a string and print it
    std::string dirPathStr = dirPath.string();
    std::cout << "Directory path: " << dirPathStr << std::endl;

    // Check if the directory exists and is a directory
    if (!bfs::exists(dirPath) || !bfs::is_directory(dirPath))
    {
        std::cout << "dirPath not exist" << dirPath << std::endl;
        return;
    }

    for (bfs::recursive_directory_iterator it(dirPath), end; it != end; ++it)
    {
        if (bfs::is_regular_file(*it))
        {
            std::cout << "filepath=" << it->path().string() << std::endl;
            filePaths.push_back(it->path().string());
        }
    }
}

int main()
{
    const std::string dirPathStr = "/path/to/your/directory";   
    std::vector<std::string> filePaths;
    listFilesRecursive(dirPath, filePaths);

    return 0;
}
c++ windows boost-filesystem
1个回答
0
投票

如果递归路径太深,那么通常 boost 会挂起,并且您将无法从 boost 获得任何错误或异常。我建议使用条件编译来解决这个问题。

#ifdef _WIN64 // Check if compiling on Windows (64-bit)
#include <filesystem>
namespace fs = std::filesystem;
#else // Not compiling on Windows (64-bit), assume Linux
#include <boost/filesystem.hpp>
namespace bfs = boost::filesystem;
#endif // _WIN64

以这种方式,在 Windows 上您可以使用 std::filesystem 编译和执行代码,在 Linux 上使用 boost::filesystem 编译和执行代码

© www.soinside.com 2019 - 2024. All rights reserved.