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

时间:2019-05-08 08:58:40

标签: c symlink

rename()C函数在整个文件系统中均不起作用。因此,我可以通过打开副本,读取它们并将它们写入新副本然后取消链接来通过副本移动文件。但是我很难使它与符号链接一起使用。 (这个想法是移动一个文件夹,其中包含一堆其他文件/文件夹/符号链接等)。基本上在C中实现mv命令。

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

适用于普通文件(我还有另一个功能可以正常处理目录)。但是,只要碰到符号链接,我都会错误吐出没有此类文件或目录

我可以通过 d_type 来检测它是否是一个符号链接,但是我不确定一旦有符号链接后如何读取/复制它,因为正常的文件复制似乎不适用于符号链接,因为open()拒绝打开它们。

2 个答案:

答案 0 :(得分:5)

一旦确定要处理符号链接(例如,可以通过使用lstat()完成),则可以使用readlink()读取其内容,并通过调用在目标位置重新创建它symlink()

另请参阅man 7 symlink

答案 1 :(得分:0)

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

要“复制”符号链接,必须使用readlink进行读取,并在目标位置创建一个新的符号链接。但是,您可能必须调整它指向的路径。

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