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

Converting a relative path to absolute on Mac and Linux

本文关键字:路径 转换 相对 Mac Linux      更新时间:2023-10-16

这就是我想要实现的:

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上还有什么其他功能可以解决我的任务?

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

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

实现它的一个好方法是为路径(push/pop)使用堆栈,为相对路径使用队列。将字符串转换成这个应该很容易。例如(用于创建基本路径)

我假设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通过改变分隔符