c ++ - 解析文件路径中定义的所有符号链接

时间:2013-07-01 09:19:26

标签: c++ symlink filepath

短版

如何从其中一个dirs为符号链接的路径中获取已解析的路径:

示例:

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

所以解析后的文件路径的结果是: / X / A / B / d / F1

长版

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

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

  • Dir1 = / a / b / c / d
  • Dir2 = / x / y / d /

假设我在dir1中有文件'f1',在dir2中有'f1'文件,所以我的过程会这样做:

  1. 删除/ x / y / d / f1
  2. 复制/ a / b / c / d / f1至/ x / y / d / f1
  3. 我的问题如下:

    说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'本身是符号链接时起作用。当其中一个父目录是符号链接时它不起作用。

    有什么想法吗?

2 个答案:

答案 0 :(得分: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" path组件应该是符号链接。因此,您必须迭代并解析每个路径组件。

答案 1 :(得分:0)

如果您只是想避免上述碰撞场景,则更容易创建一个canary文件并尝试通过其他构造路径访问它。如果你的意思是一般的问题,那就是全面的dir操作。

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

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