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

C++ c++;-解析文件路径中定义的所有符号链接 短版,c++,symlink,filepath,C++,Symlink,Filepath,如何从其中一个目录为符号链接的路径中获取解析路径: 例如: 假设path=/x/y/d/f1,其中y是指向/a/b的符号链接 因此,解析文件路径的结果将是: /x/a/b/d/f1 长版本 < >我想编写一个C++函数,将文件从DI1复制到DRI2(当然这不是实际问题,而是一个更大更复杂的问题的减少)。p> 在复制过程之前,我想删除dir2中所有要从dir1复制的文件。 假设我有: Dir1=/a/b/c/d Dir2=/x/y/d/ 假设我在dir1中有文件“f1”,在dir2中有文件“f

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

例如:

假设path=/x/y/d/f1,其中y是指向/a/b的符号链接

因此,解析文件路径的结果将是: /x/a/b/d/f1

长版本 < >我想编写一个C++函数,将文件从DI1复制到DRI2(当然这不是实际问题,而是一个更大更复杂的问题的减少)。p> 在复制过程之前,我想删除dir2中所有要从dir1复制的文件。 假设我有:

  • Dir1=/a/b/c/d
  • Dir2=/x/y/d/
假设我在dir1中有文件“f1”,在dir2中有文件“f1”,那么我的进程将执行以下操作:

  • 删除/x/y/d/f1
  • 将/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”本身是符号链接时有效,但在其父目录之一是符号链接时无效


    有什么想法吗?

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

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


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

    下面的链接将为您提供答案

    您可以使用以下代码解析符号:

    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”路径组件应为符号链接。因此,您必须迭代并解析每个路径组件。

    不要试图避免冲突。正如我所说,我的问题比这更大,但是我想更好地理解你的建议。你能详细说明一下吗?“通过访问”是什么意思?您应该使用
    memset(buf,0,sizeof(buf))
    readlink(“/x/y/d”,buf,sizeof(buf)-1)
    ,因为readlink不会在字符串中附加空终止符。