Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linux/UNIX上用纯C递归复制目录_C_Linux_Unix_Copy - Fatal编程技术网

在Linux/UNIX上用纯C递归复制目录

在Linux/UNIX上用纯C递归复制目录,c,linux,unix,copy,C,Linux,Unix,Copy,有人能给我一个可能的解决方案吗?我不想使用/bin/cp或任何其他外国应用程序。我希望我的程序是独立的。我还知道每个系统都非常具体,所以我对UNIX/Linux兼容性感兴趣 我怎样才能解决它?只是沿着源目录,在目标目录中创建一个新目录并复制其中的文件,还是有更好的解决方案 顺便说一句,我的目标是:将所有一级子目录递归复制到目标目录中,如果它们不存在的话您确实需要某种递归下降到目录树中。这样做,您实际上可以使它非常可移植(在Linux上使用opendir/readdir,在Windows上使用Fi

有人能给我一个可能的解决方案吗?我不想使用
/bin/cp
或任何其他外国应用程序。我希望我的程序是独立的。我还知道每个系统都非常具体,所以我对UNIX/Linux兼容性感兴趣

我怎样才能解决它?只是沿着源目录,在目标目录中创建一个新目录并复制其中的文件,还是有更好的解决方案


顺便说一句,我的目标是:将所有一级子目录递归复制到目标目录中,如果它们不存在的话

您确实需要某种递归下降到目录树中。这样做,您实际上可以使它非常可移植(在Linux上使用
opendir
/
readdir
,在Windows上使用
FindFirstFile
/
FindNextFile
)。剩下的问题是实际的复制。您可以通过以下算法使用C标准库:

  • 开源文件
  • 打开目标文件
  • 在循环中,
    fread
    从源文件中读取一个大小恒定的块,然后
    fwrite
    将其写入目标文件。如果源文件不包含更多数据,请停止

希望这有帮助:)

使用POSIX函数遍历要复制的树。为该函数提供一个回调函数,该函数在每个文件/目录的路径上被调用。定义一个回调,将调用它的文件/dir复制到目标树中。类型为
struct FTW*
的第四个回调参数可用于计算相对路径。

如果只想使用C,可以使用dirent.h。使用它,您可以递归地遵循目录结构。然后您可以以二进制模式打开文件,并通过写入流将其写入所需位置。

这是家庭作业吗?你最后一句话听起来很可疑。如果是,请贴上这样的标签。为什么要重新发明轮子?为什么不直接使用例如
rsync
?@NiklasB。谢谢你的建议如果我错了,请纠正我,但我认为你不能限制这次步行的深度。@NiklasB:你的问题中没有这样的要求。不,你不能限制行走的深度,但你可以在回调中得到深度。这不是我的问题,但它包含这个“第一级细分”约束。谢谢你提供的额外信息。@NiklasB:啊,这就是你的意思。如果您至少达到2级,则可以通过签入回调来实现这一点;如果没有,则不要复制非目录。或者,只需使用
nftw
编写一个常规的复制树算法,并在循环中的每个子目录上调用它,跳过文件。是的,这应该非常有用,os当我将目标指向应该复制的目录时,我可以使用
nftw
复制所有树。