如何使用 std::filesystem 实现递归目录和文件列表?
How to implement recursive directories and files listing using std::filesystem?
我想自己实现递归目录和文件列表。我不想用
std::filesystem::recursive_directory_iterator
我试过这段代码:
void TraverseDirectory(const std::string& rootDirectory)
{
//Go thru the root directory
for(const auto& entry : std::filesystem::directory_iterator(rootDirectory)) {
std::string filenameStr = entry.path().filename().string();
//if the first found entry is directory go thru it
if(entry.is_directory()) {
std::cout << "Dir: " << filenameStr << '\n';
TraverseDirectory(filenameStr);
}
//print file name
else if(entry.is_regular_file()) {
std::cout << "file: " << filenameStr << '\n';
}
}
}
int main()
{
TraverseDirectory("testdir");
}
但是当主循环进入 TraverseDirectory(filenameStr);
:
时它给了我这个错误
如何在不出现上述错误的情况下遍历目录及其文件?
std::filesystem::path::filename
Returns the generic-format filename
component of the path.
Equivalent to relative_path().empty() ? path() : *--end().
这意味着,对于实际路径 /foo/bar/42.txt
你会得到 42.txt
return。现在,在
if(entry.is_directory()) {
std::cout << "Dir: " << filenameStr << '\n';
TraverseDirectory(filenameStr);
}
您的递归调用仅接收路径的文件名部分,因此尝试进入 bar
,而不是例如 foo/bar
。
所以你最好把它改成
TraverseDirectory(entry.path());
我想自己实现递归目录和文件列表。我不想用
std::filesystem::recursive_directory_iterator
我试过这段代码:
void TraverseDirectory(const std::string& rootDirectory)
{
//Go thru the root directory
for(const auto& entry : std::filesystem::directory_iterator(rootDirectory)) {
std::string filenameStr = entry.path().filename().string();
//if the first found entry is directory go thru it
if(entry.is_directory()) {
std::cout << "Dir: " << filenameStr << '\n';
TraverseDirectory(filenameStr);
}
//print file name
else if(entry.is_regular_file()) {
std::cout << "file: " << filenameStr << '\n';
}
}
}
int main()
{
TraverseDirectory("testdir");
}
但是当主循环进入 TraverseDirectory(filenameStr);
:
如何在不出现上述错误的情况下遍历目录及其文件?
std::filesystem::path::filename
Returns the generic-format filename component of the path.
Equivalent to relative_path().empty() ? path() : *--end().
这意味着,对于实际路径 /foo/bar/42.txt
你会得到 42.txt
return。现在,在
if(entry.is_directory()) {
std::cout << "Dir: " << filenameStr << '\n';
TraverseDirectory(filenameStr);
}
您的递归调用仅接收路径的文件名部分,因此尝试进入 bar
,而不是例如 foo/bar
。
所以你最好把它改成
TraverseDirectory(entry.path());