【问题标题】:How to convert absolute path to relative in c linux如何在c linux中将绝对路径转换为相对路径
【发布时间】:2023-04-02 02:55:01
【问题描述】:

我想知道如何在 linux (Ubuntu) OS 上以 c 语言根据给定目录(包括链接文件)将符号链接的绝对路径转换为相对路径。

我想搜索相对路径的子字符串,但如果它已经存在于文件夹层次结构的更高层呢?

下面是我想要做的更具体的描述: 相对路径:

 folder/folder1/folder2

绝对路径:

/home/giorgos/Desktop/folder/folder1/folder2/a.pdf

改为

/home/giorgos/Desktop/myfolder/folder1/folder2/a.pdf

显然我不能简单地搜索和替换“文件夹/”,考虑这种情况:

/home/giorgos/Desktop/folder/folder/folder/folder1/folder2/a.pdf

它可以向前和向后搜索,如果替换它仍然会给出错误的输出 只有当我知道相对路径时,我才能向后搜索绝对路径并替换它,那么输出才是正确的:

   /home/giorgos/Desktop/folder/myfolder/folder/folder1/folder2/a.pdf

【问题讨论】:

  • 相对于什么?当前目录?
  • 是的,当前目录的相对目录,我会尽量具体一点
  • 我知道没有通用的预先编写的代码可以做到这一点;这个问题的背景是什么?可能有一个很好的解决方案不一定走这条路。
  • 您可能是对的,我实际上是在尝试将一个文件夹及其所有内容复制到另一个文件夹,其中包括链接,我希望它们指向新文件夹的项目。认为我应该发布另一个问题?
  • 我正在提出一个新问题,因为这有点笼统,请帮助there 感谢所有帮助我希望我没有把关于同一主题的两个问题弄得一团糟对不起关于它

标签: linux path symlink relative-path absolute-path


【解决方案1】:

将路径转换为相对路径是首先查看两条路径之间共享了多少基本原子,然后插入 ../ 以在树上向后导航,然后再向下导航到正确的分支。 IE 从:/foo/bar/some/path/foo/other/path 你会首先看到他们共享 /foo,向上导航到你需要 3 ../ 的那个点,将相对路径变成 /foo/../../../other/path。 C++ here 有一个 boost::filesystem 示例,除了 C++ 和 boost::filesystem 之外,同样可以在 C 中完成。

【讨论】:

  • 如果路径像 /foo/bar/one/foo 并且你要去 foo/bar/one/foo/onemore 那么你会在第一个遇到的 foo 处停下来。我说的对吗?
  • 不,你继续。在上面的例子中,如果你要从第一个到第二个,你会看到第一个的整体与第二个是共同的,所以结果就是 onemore 。原子在整个目录树中不需要是唯一的,分支本身就是路径的 UID。
【解决方案2】:

我很想做出决定,如果我正在编写这个工具,那么绝对符号链接在文件系统中的其他位置移动时应该具有相同的值——用户想要一个非常具体的文件。而且,相对符号链接在移动到文件系统的其他位置时应该具有相同的值——用户希望链接能够工作,而不管目录树的根目录在哪里。

但是,如果这两种类型的链接混合在一起,那么您将需要做更多的工作——我假设您现在就是这样。 (Unix 程序对于猜测用户的意图通常不会那么宽容;如果你只是 readlink(2)symlink(2) 正是文件系统所说的,那么你的程序永远不会令人惊讶。)

rsync(1) 可能有一些您可以使用的源代码——或者至少可以从中学习。 --safe-links 命令行选项导致rsync 忽略 指向它被指示复制的树之外的绝对符号链接和相对符号链接。这不是您希望的相对路径的规范化,但它可以提供足够的代码来发现哪些链接指向相关目录树之外。

有点相关; Linux 特定的symlinkat(2) 系统调用可以让您更轻松地创建符号链接。 (...at() 系统调用系列类似于为进程提供多个“当前工作目录”,而无需您自己进行所有fchdir(2) 调用。)

【讨论】:

  • 谢谢,我去看看。实际上现在我对目录树之外的符号链接不感兴趣
【解决方案3】:

好吧,起初我并不认为以下是重要信息,但在函数的帮助下,我找到了原始目录和复制目录的绝对路径。

这样我终于可以得到原始文件夹的“相对路径”(从原始文件夹开始的路径)将目录树名的根节点更改为复制的文件夹,然后获取复制文件夹的绝对路径并附加复制的“相对路径”,就是这样!

realpath(directory,absolutePath);

这就是我的代码的样子:

readlink(A[i].str, oldLink, NAMESIZE);//A is the struct I keep the paths to directory entries
k=0;
j=strlen(absolutPath);
while(oldLink[j]!='\0')
{
    fixLink[k]=oldLink[j];
    j++;
    k++;
}
strcpy(tmpLink,newAbsolutPath);
strcat(tmpLink,fixLink);
symlink (tmpLink,tmpPath);//tmpPath is the name of the link, tmp link is the absolute path to the actual file
//tmpPath is built almost the same way

到目前为止,它运行没有任何错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 2011-11-07
    • 2011-05-02
    相关资源
    最近更新 更多