我有一个函数在 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;
}
如果递归路径太深,那么通常 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 编译和执行代码