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()拒绝打开它们。
答案 0 :(得分:5)
一旦确定要处理符号链接(例如,可以通过使用lstat()
完成),则可以使用readlink()
读取其内容,并通过调用在目标位置重新创建它symlink()
。
另请参阅man 7 symlink
。
答案 1 :(得分:0)
当您open
没有符号O_NOFOLLOW
的符号链接时,它将取消引用符号链接(或符号链接链,如果它是符号链接的符号链接)。如果目标不存在,则打开将失败。 O_NOFOLLOW
标志可确保,如果您尝试打开符号链接,则确实会出现错误。
要“复制”符号链接,必须使用readlink
进行读取,并在目标位置创建一个新的符号链接。但是,您可能必须调整它指向的路径。
但是如果您的程序需要在* nix系统上复制目录树,则正确的实现方式不是重新发明轮子,而是遵循Unix方式用正确的参数执行cp
程序。