0

精简版

如何从其目录之一是符号链接的路径中获取已解析的路径:

例子:

说 path = /x/y/d/f1 其中 y 是到 /a/b 的符号链接

所以解析文件路径的结果是:/x/a/b/d/f1

长版

我想编写一个将文件从 dir1 复制到 dir2 的 c++ 函数(当然这不是实际问题,而是减少更大和更复杂的问题)。

在复制过程之前,我想删除 dir2 中将从 dir1 复制的所有文件。说我有:

  • 目录 1 = /a/b/c/d
  • 目录 2 = /x/y/d/

假设我在 dir1 中有文件“f1”,在 dir2 中有文件“f1”,所以我的过程会:

  1. 删除 /x/y/d/f1
  2. 将 /a/b/c/d/f1 复制到 /x/y/d/f1

我的问题如下:

假设 dir 'y' 是指向 /a/b/c/ 的符号链接。现在,当我删除 /x/y/d/f1 时,实际上是在删除 /a/b/c/d/f1。(我的例子可能有漏洞,但我希望你明白)

我想避免这种情况,也就是说,当我要删除 /x/y/d/f1 时,我希望能够知道我将要删除 /x/y/d/f1 并跳过该删除

我尝试使用 POSIX readlink() 函数,但它仅在文件“f1”本身是符号链接时有效,但当其父目录之一是符号链接时不起作用。

有任何想法吗?

4

2 回答 2

1

下面的链接会给你答案。

http://ubuntuforums.org/showthread.php?t=1126617

您可以使用以下代码来解析 symilnks:

char buf[512];
int count = readlink("/x/y/d", buf, sizeof(buf));
if (count >= 0) {
    buf[count] = '\0';
    printf("%s -> %s\n", argv[1], buf);
}

在上面的代码中,“d”路径组件应该是符号链接。因此,您将不得不迭代并解析每个路径组件。

于 2015-01-02T06:44:53.490 回答
0

如果您只是想避免上述冲突情况,创建一个金丝雀文件并尝试通过其他构造路径访问它会更容易。如果您的意思是一般的问题,那么对于完整目录操作。

如果不清楚:如果您创建 /x/y/d/TEMP123456 如果它们实际上指向相同的目录,它将显示为 /a/b/c/d/TEMP123456 (或相反)。

对于单个文件,它可能更容易:打开源文件以进行独占访问,然后再尝试在目标目录中删除它。(如果您将 NFS 系统添加到组合中,我不确定这有多可靠。)

于 2013-07-01T09:22:32.300 回答