我想获得一个给定的绝对规范路径,其中包含在Windows和Linux中都可以使用的boost文件系统的相对路径。我希望它也适用于不存在的路径。
我正在使用从boost 1.60开始可用的weakly_canonical(path relativePath)。但它的行为不符合预期(至少在Windows中)。
当传递没有父文件夹的相对路径(即原始文件名或文件夹名称,例如“ foo”)时,weakly_canonical返回相同的未修改路径(在这种情况下为“ foo”),而absolute(path relativePath)则在当前路径之前(如我所料)(“ current_dir / foo”)。
因此,最后,我不得不先调用绝对值,然后再调用weakly_canonical使其正常工作。
查看这两种情况的摘要。
#include <string>
#include <iostream>
#include <boost/filesystem.hpp>
using boost::filesystem;
path relativePath("foo");
path canonical_path = weakly_canonical(relativePath);
path abs_canonical_path = weakly_canonical(absolute(relativePath));
std::cout << "Using weakly_canonical: "<<canonical_path.string()<<std::endl;
std::cout << "Using weakly_canonical and absolute: "<<abs_canonical_path.string()<<std::endl;
例如,如果current_path是“ C:\ path \ to \ some \ folder”,则表示:
使用weakly_canonical:C:\ path \ to \ some \ folder \ foo 使用weakly_canonical和绝对值:C:\ path \ to \ some \ folder \ foo
使用weakly_canonical:C:\ path \ to \ some \ foo 使用weakly_canonical和绝对值:C:\ path \ to \ some \ foo
使用weak_canonical:foo 使用weakly_canonical和绝对值:C:\ path \ to \ some \ folder \ foo
这最后一种情况令我感到困惑,因为我希望“ weakly_canonical”也位于当前工作目录的前面。
同时使用absolute_canonical和canonical_canonical是否正确?还是我在滥用weakly_canonical?
答案 0 :(得分:0)
好吧,documentation说:“ 返回符号链接已解析且结果归一化的p ”,这并不是说它将构成完整路径。您的“ foo”在路径中没有符号链接和点。
答案 1 :(得分:0)
Documentation 说:“返回:一个路径,由调用 canonical
函数的结果组成,该路径由存在的 p
的前导元素组成,如果有的话, 后跟不存在的 p
元素(如果有)。"
重要的一点是,只有当 canonical
的前导元素实际存在时,才会调用 p
(它确实构造了一个绝对路径)。
如果您在第一个元素不存在的相对路径上调用 weakly_canonical
,则不会调用 canonical
,如果使用点,则后面的部分只是标准化。
所以 weakly_canonical("foo")
可以返回 foo
如果这条路径没有
存在或绝对路径(如果确实存在)。
对于我可以测试的 std::filesystem::weakly_canonical
的不同实现,这种行为是相同的。
如果您想确保具有绝对形式的规范路径,您可以在 absolute
之后调用 weakly_canonical
:
boost::filesystem::absolute(boost::filesystem::weakly_canonical("foo"))