2012-02-08 42 views
1

有人可以指导我解决一个可能的解决方案吗?我不想使用/bin/cp或任何其他外国应用程序。我希望我的计划是独立的。另外我知道每个系统都非常具体,所以我对UNIX/Linux兼容性感兴趣。在Linux/UNIX上以纯C递归复制目录

我该如何解决?只要沿着源代码目录并在目标文件夹中创建一个新目录并复制其中的文件,或者有更好的解决方案?

BTW我的目标是:复制所有一级子目录递归到目标目录。如果它们不存在有

+1

这功课吗?你最后一句话听起来很可疑。如果是这样,请标记为。 – 2012-02-08 11:20:31

+0

为什么重新发明车轮?为什么不使用例如'rsync'? – 2012-02-08 11:21:45

+0

@NiklasB。感谢您的建议 – Uko 2012-02-08 11:29:11

回答

2

你真的需要某种形式的递归下降到一个目录树。这样做,你可以实现这个非常便携(在Linux上使用opendir/readdir,在Windows上使用FindFirstFile/FindNextFile)。剩下的问题是实际的复制。可以使用C标准库为与下面的算法:

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

希望这有助于:)

1

使用POSIX nftw(3)功能走路要复制树。您可以使用一个回调函数提供此函数,该函数将在每个文件/目录的路径上调用。定义一个回调,将它被调用的文件/目录复制到目标树中。类型struct FTW *的第四个回调参数可用于计算相对路径。

+0

纠正我,如果我错了,但我不认为你可以限制这种行走的深度。 – 2012-02-08 12:54:03

+0

@NiklasB:你的问题中没有这样的要求。不,你无法限制步行的深度,但你确实可以获得回调的深度。 – 2012-02-08 13:09:05

+0

这不是我的问题,但它包含这个“第一级别subdirs”约束。感谢您的额外信息。 – 2012-02-08 13:09:55

0

如果你只想使用C,你可以使用dirent.h。使用这个,你可以递归地跟随目录结构。然后,您可以在二进制模式下打开文件,并通过写入流将它们写入所需的位置。