如何使用std :: filesystem实现递归目录和文件列表?

时间:2020-08-10 22:13:46

标签: c++ filesystems

我想自己实现递归目录和文件列表。我不想使用

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);时,它给了我这个错误:

enter image description here

如何遍历目录及其文件而没有上面显示的错误?

1 个答案:

答案 0 :(得分:1)

std :: filesystem :: path :: filename

返回通用格式的文件名 路径的组成部分。

是否等效于relative_path()。empty()? path():*-end()。

这意味着,对于实际路径/foo/bar/42.txt,您将获得42.txt的回报。现在,在这里

if(entry.is_directory()) {
   std::cout << "Dir: " << filenameStr << '\n';
   TraverseDirectory(filenameStr);
}

您的递归调用仅接收路径的文件名部分,因此尝试进入bar,而不是foo/bar

因此,最好将其更改为

TraverseDirectory(entry.path());
相关问题