C++ 将std::filesystem与linux一起使用是错误的还是无法访问文件系统树?

C++ 将std::filesystem与linux一起使用是错误的还是无法访问文件系统树?,c++,linux,ubuntu,filesystems,c++17,C++,Linux,Ubuntu,Filesystems,C++17,我试图打印系统的目录树,但在使用根目录或其附近的某个位置时,程序会抛出一个异常,如下所示 terminate called after throwing an instance of 'std::filesystem::__cxx11::filesystem_error' what(): filesystem error: status: Too many levels of symbolic links [/home/asmmo/.local/share/webkitgtk/databa

我试图打印系统的目录树,但在使用根目录或其附近的某个位置时,程序会抛出一个异常,如下所示

terminate called after throwing an instance of 'std::filesystem::__cxx11::filesystem_error'
  what():  filesystem error: status: Too many levels of symbolic links [/home/asmmo/.local/share/webkitgtk/databases/indexeddb/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0/v0]
在使用root本身时,程序抛出

terminate called after throwing an instance of 'std::filesystem::__cxx11::filesystem_error'
  what():  filesystem error: status: Too many levels of symbolic links [/sys/kernel/software_nodes/node2/dw-apb-uart.2/firmware_node/physical_node1/firmware_node/physical_node1/firmware_node/physical_node1/firmware_node/physical_node1/firmware_node/physical_node1/firmware_node/physical_node1/firmware_node/physical_node1/firmware_node/physical_node1/firmware_node/physical_node1/firmware_node/physical_node1/firmware_node/physical_node1/firmware_node/physical_node1/firmware_node/physical_node1/firmware_node/physical_node1/firmware_node/physical_node1/firmware_node/physical_node1/firmware_node/physical_node1/firmware_node/physical_node1/firmware_node/physical_node1/firmware_node/physical_node1]
我使用的代码是:

#include<iostream>
#include<filesystem>
#include<fstream>


void processPth(const std::filesystem::path&, std::ostream& = std::cout, const size_t& =0);

int main() {

    std::filesystem::path p{LR"(/home/asmmo)"};//or p{LR"(/)"} for the root
    std::ofstream myFile{"tree.txt"};
    processPth(p, myFile);

}




void processPth(const std::filesystem::path & p, std::ostream& ostream , const size_t& level ){
    if(!std::filesystem::exists(p)) return;//base case

    if(std::filesystem::is_regular_file(p))
        ostream<<std::string(2*level, ' ')<<"File: "<< p.filename()<<"\tSize: "<<std::filesystem::directory_entry(p).file_size()<<"\n";
    else if(std::filesystem::is_directory(p))
    {
        ostream<<std::string(2*level, ' ')<<"Directory: "<< p.filename()<<"\n";
        for(const auto& it : std::filesystem::directory_iterator(p))
            processPth( it, ostream, level+1);
    }


}
当我尝试打印某个近目录的树时(如以下代码中所示),效果很好

int main() {

    std::filesystem::path p {std::filesystem::current_path()};
    std::ofstream myFile{"tree.txt"};
    processPth(p, myFile);

}

如果文件系统有一个符号链接链接回它的一个父目录,那么递归地搜索该目录将以无限递归结束,因为符号链接会一直将您带回父目录

系统只允许这么多的递归,如果递归太深,系统将返回一个错误


当递归地遍历这样的目录时,您可能应该忽略符号链接。您可以使用来测试路径是否为符号链接。

您了解符号链接是什么吗?@walnut不知道。它与数据库或类似的东西有关吗?那么我建议你先读一下。然后,可以使用从循环中排除符号链接。它们是文件系统中的链接。例如,在第一个示例中,
v0
不是一个目录,它是一个符号链接,链接到它上面的目录,因此它是递归的。@walnut我现在明白了。非常感谢你
int main() {

    std::filesystem::path p {std::filesystem::current_path()};
    std::ofstream myFile{"tree.txt"};
    processPth(p, myFile);

}