在Mac和Linux上将相对路径转换为绝对路径

时间:2014-06-17 12:28:01

标签: c++ linux macos relative-path filepath

这就是我要实现的目标:

CString r = CDir("/users/administrator/path/3/4/5").absolutePathFor("../../2/../3/");

r现在应包含“/ users / administrator / path / 3/3 /".

在Windows上,这是使用GetFullPathName完成的。在Linux和Mac上,有一个简单的旧C函数realpath()几乎可以解决问题。但是,它有一个巨大的问题:它似乎只适用于实际存在的路径。在我的示例中,路径的某些部分不存在,并且该部分从realpath返回的结果中截断。 Mac和Linux上还有哪些其他功能可以解决我的任务?

1 个答案:

答案 0 :(得分:1)

你的意思是你想要计算路径是什么,即使路径不存在(所以你不能向操作系统询问它)?

在这种情况下,我猜你可以创建一个将当前目录参数和相对路径作为参数的函数。然后检查每个/之间的内容。如果它是 ”。”你忽略它,如果它是“..”你从当前路径中删除最后一个目录,如果它是你将其添加到当前路径的其他内容。

实现它的一个好方法是使用堆栈作为路径(推/弹)和相对路径的队列。将字符串转换为此应该非常简单。例如(用于制作基本路径)

我假设BasePath是路径的输入字符串参数

std::stack<string>path;
string temp;
for (int i=0;i<BasePath.size()
    if(BasePath[i]!='/')
        temp+=BasePath[i];
    else
        path.push(temp), temp.clear();

这非常难看,可以使用正则表达式完成但是因为你说你没有Boost我也会假设你没有C ++ 11而且对于这种复杂性你无论如何都可以逃脱它。

对于有趣的部分,你可以这样做

while(!relativepath.empty())
{
    if(relativepath.front()==".."
        path.pop();
    if(relativepath.front()=="." {}
    else
        path.push(relativepath.front());
   relativepath.pop();
}

我不确定这是你想要的,但它并不难做,你可以通过更改分隔符轻松适应Windows / Linux。