如何从其中一个dirs为符号链接的路径中获取已解析的路径:
示例:
Say path = / x / y / d / f1其中y是/ a / b的符号链接
所以解析后的文件路径的结果是: / X / A / B / d / F1
我想编写一个将文件从dir1复制到dir2的c ++函数(当然这不是实际问题,而是减少更大更复杂的问题)。
在复制过程之前,我想删除dir2中将要从dir1复制的所有文件。 说我有:
假设我在dir1中有文件'f1',在dir2中有'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'本身是符号链接时起作用。当其中一个父目录是符号链接时它不起作用。
有什么想法吗?
答案 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系统添加到混合中,我不确定它有多可靠。)