这个程序:
#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 。
实际标准说:“如果 *this
是 has_relative_path()
,则返回: false
,否则通用格式路径名是 *this
的通用格式路径名的最长前缀,该路径少生成一个迭代中的元素。” 和 relative_path()
是 root_path()
之后的所有内容,所以没有relative_path()
在这种情况下,所以 parent_path()
返回*this
和has_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/