如何以编程方式将 Linux 符号链接移动到 C 中的不同文件系统(副本)?

How to programatically move a Linux symlink to a different file system (copy) in C?

rename() C 函数不能跨文件系统工作。因此,我可以通过副本移动文件,方法是打开文件、读取文件并将它们写入新副本,然后取消链接。但是我很难让它与符号链接一起使用。 (想法是移动一个文件夹,里面有一堆其他 files/folders/symlinks 等)。基本上在 C 中实现 mv 命令。

open(file, O_RDONLY)
while ((c = read(source_descriptor, buf, SIZE)) > 0){
        write(d, buf, c);
}
unlink file;

适用于普通文件(我还有另一个函数可以毫无问题地处理目录)。但是每当它遇到符号链接时,我都会 perror 吐出 No such file or directory.

我可以通过 d_type 检测它是否是一个符号链接,但是我不确定如何 read/copy 它一旦我有一个,因为正常的文件副本没有似乎可以使用符号链接,因为 open() 拒绝打开它们。

一旦你确定你正在处理一个符号链接(这可以通过使用 lstat()), you can read its contents with readlink() and recreate it at the target location by calling symlink().

另见 man 7 symlink

当您 open 一个没有 O_NOFOLLOW 标志的符号链接时,它将取消引用该符号链接(或符号链接链,如果它是符号链接的符号链接)。如果目标不存在,打开将失败。 O_NOFOLLOW 标志确保,如果您尝试打开符号链接,您确实会收到错误消息。

要 "copy" 一个符号链接,您必须使用 readlink 读取它并在目标位置创建一个新的符号链接。但是你可能需要调整它指向的路径。

但是如果你的程序需要在*nix系统上复制目录树,正确的实现方法不是重新发明轮子,而是遵循Unix 方式,只需使用正确的参数执行 cp 程序。