c++ - std::filesystem 根路径如何将自身作为父路径?

标签 c++ std-filesystem

这个程序:

#include <iostream>
#include <filesystem>

int main()
{
    std::filesystem::path p1("c:\\");
    std::filesystem::path p2("c:/");
    if (p1.has_parent_path())
        std::cout << "Parent path of " << p1 << " is " << p1.parent_path() << std::endl;
    if (p2.has_parent_path())
        std::cout << "Parent path of " << p2 << " is " << p2.parent_path() << std::endl;
}

产生此输出:

Parent path of "c:\\" is "c:\\"
Parent path of "c:/" is "c:/"

(编辑:我对正斜杠的使用感到困惑,因此我更新了此代码以显示无论您在 Windows 上使用哪种路径分隔符,都会发生相同的情况)

这对我来说毫无意义。目录如何成为其自身的父目录?如果“has_parent”函数永远不会返回 false,那么它还有什么意义呢?

最重要的是:如果我正在编写递归搜索目录树以查找文件的代码,那么检测我是否已访问根文件夹并应该停止的最佳/最可靠方法是什么?

(如果重要的话,我正在 C++17 语言模式下使用 Visual Studio 2019)

最佳答案

实际上godbolt示例中没有任何输出,因为测试是在posix环境下的GCC上运行的,其中"C:\\"不是根目录,因此它被视为一个奇怪的目录/文件名,其父目录为空,但带有 correct posix root path "/"正如OP正在观察的那样,它会给出输出。 所以不,根目录的parent_path()( "/""C:\\" )不为空,因此 has_parent_path() 在我所知道的 std::filesystem 的所有实现上都是 true 。

实际标准说:“如果 *thishas_relative_path(),则返回: false ,否则通用格式路径名是 *this 的通用格式路径名的最长前缀,该路径少生成一个迭代中的元素。”relative_path()root_path() 之后的所有内容,所以没有relative_path()在这种情况下,所以 parent_path()返回*thishas_parent_path()返回 true,如 OP 示例中所示。

对于为什么标准选择这种行为的问题,我的猜测是,这就是 cd ..在每个操作系统上都会这样做,如果您已经处于根目录,那么您将保持相同的根目录。

事实上,检测结束的一种可能方法是:(!p.has_parent_path() || !p.has_relative_path())或者甚至!p.has_relative_path() ,取决于如果它是无根的,您是否想以空路径结束。

关于c++ - std::filesystem 根路径如何将自身作为父路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58201083/

相关文章:

c++ - 在 C++ 命令行应用程序中,我应该如何在顶层捕获异常?

c++ - 如何在 Visual C++ 中使用 UTF8Encoding

c++ - 从 std::filesystem::directory_iterator() 获取最后一个文件名而不迭代?

c++ - `std::filesystem::path` 没有反向迭代器?

c++ - 哪个声明是 C++/C 中的标准?

C++11 自动和函数返回类型

c++ - SFINAE成员(member)通过

c++ - 如何递归复制文件夹和文件而不损失文件修改时间?

c++ - 为什么 std::filesystem::path::compare() 和 boost::filesystem::path::compare() 不同?

c++ - 检查路径是否有效,即使它不存在