我想复制一个文件夹及其所有内容,包括子文件夹。我在Ubuntu上使用C语言。
到目前为止,复制常规文件和文件夹很容易,但复制链接的规范(现在是符号)是它们应该链接到复制的文件。现在我只对目录树中的链接感兴趣。
(虽然树外的链接我认为应该更容易 - 只需将完整路径复制到新链接并查明它们是否属于树 - 虽然sarnold给了我关于使用的提示,但这很难rsync
实现这一点)
所以我有readlink返回的绝对路径:
/home/giorgos/Desktop/folder/folder1/a.pdf
最糟糕的情况是:
/home/giorgos/Desktop/folder/folder/folder/folder1/a.pdf
但我找不到一种方法来检索目录树的相对路径。如果我能找到它,我可以用复制目录的名称替换它:
/home/giorgos/Desktop/March/folder/myfolder/folder/folder1/a.pdf
我不能使用cp或system()函数或那种函数,解决方案必须是低级别的。我可以使用c库加GNU,但无论如何我都要发帖回答。
答案 0 :(得分:0)
我们假设您需要将目录SRC_DIR
复制到DST_DIR
,这两个目录都是绝对路径(如果不是,您使用getcwd
转换它们是微不足道的)
这个伪代码应该涵盖所有可能性(它可能涉及大量重复使用strtok
来标记'/'分隔符处的路径):
if (SRC_DIR/SUBDIRS/LINK is a symlink that points to TARGET_LOCATION)
{
// TARGET_LOCATION may be relative *or* absolute. Make it absolute:
if (TARGET_LOCATION does not begin with '/')
{
prepend SRC_DIR/ to it
}
if (TARGET_LOCATION contains a subdirectory named '..')
{
replace occurances of 'SOMEDIRNAME/..' with ''
}
if (TARGET_LOCATION contains a subdirectory named '.')
{
replace occurances of '/.' with ''
}
// now TARGET_LOCATION is an absolute path
if (TARGET_LOCATION does not begin with SRC_DIR)
{
// symlink points outside tree
create symlink DST_DIR/SUBDIRS/LINK pointing to TARGET_LOCATION
}
else
{
// symlink points inside tree
strip SRC_DIR from beginning of TARGET_LOCATION
prepend DST_DIR to TARGET_LOCATION
create symlink DST_DIR/SUBDIRS/LINK pointing to TARGET_LOCATION
}
}