使用本机C代码递归复制目录

使用本机C代码递归复制目录,c,linux,C,Linux,我希望实现Linux命令cp-Rf/*的行为,它将'src_dir'中的所有内容递归地复制到'dst_dir'中 我在网上寻求帮助,得到了一些解决方案,但他们做了以下我不想做的事情之一: 使用renamesrc_dir、dst_dir,本质上是“移动”内容而不是复制。 我需要保持'src_dir'的内容完整 打开“src_dir”读取每个文件。 我想这样做,不打开文件和阅读内容 在不使用systemcp-Rf/*的情况下,是否可以用C实现上述功能 在从最初的一些评论中意识到原来的语言令人困惑之后

我希望实现Linux命令cp-Rf/*的行为,它将'src_dir'中的所有内容递归地复制到'dst_dir'中

我在网上寻求帮助,得到了一些解决方案,但他们做了以下我不想做的事情之一:

使用renamesrc_dir、dst_dir,本质上是“移动”内容而不是复制。 我需要保持'src_dir'的内容完整

打开“src_dir”读取每个文件。 我想这样做,不打开文件和阅读内容

在不使用systemcp-Rf/*的情况下,是否可以用C实现上述功能

在从最初的一些评论中意识到原来的语言令人困惑之后,编辑了原来的问题

我希望实现linux系统命令的行为

1个cp,递归地将“src_dir”中的所有内容复制到“dst_dir”中

使用C而不使用linux系统调用可以实现上述功能吗

当然不是;请记住,应用程序与Linux内核交互的主要方式是:查看可能需要的系统调用的详尽列表。。。。不要将系统调用与对使用的C库函数的调用混淆,等等

但是,您可能会感兴趣的是,在几个系统调用之上实现了哪个。再看,

如果不进行系统调用,则无法更改文件系统上的任何内容

附录 问题变成了

在不使用systemcp-Rf/*的情况下,是否可以用C实现上述功能

对,;您可以先使用扫描文件树或适当地播放等…,然后使用…检测要创建的目录。。。;您将适当地创建目录,并显式复制文件内容,例如使用函数或、、系统调用。。。。。请注意。。。需要从文件中读取或写入任何内容,即使使用。。。当然,要复制一个文件,您需要打开它,打开它的新副本,在循环中读写副本,并关闭源文件和目标文件。但复制完成后,应同时关闭源文件和目标文件。顺便说一句,一个给定的文件可能有数百或数千个打开的文件描述符,请参阅。。。而且还要消耗一个

您打开的文件描述符的数量大多数是目录,受文件树深度的限制,因此实际上可能很小,不到一百个;使用智能缓存甚至可以避免这种情况

顺便说一句,cp是GNU的一部分,所以您可以研究它的源代码。你也可以用它来理解cp在做什么

阅读,也可以免费下载,如PDF格式的章节


无法用单个文件复制一个文件的内容。你需要一个循环。但也要看看我不推荐的特定于Linux的更好的POSIX循环和IMO no。您至少需要opendir和readdir,否则您如何读取目录?对于读/写文件,您可以使用标准的fopen/fread C函数,但即使它们最终也会调用读/写等功能。那么,您实际上想要实现什么呢?是否要编写独立于平台的程序?如果要执行I/O操作,必须使用系统调用或基于系统调用构建的函数。您的要求仍然不现实。澄清/解决这些问题。有些操作系统可能会提供诸如“CopyFile”之类的调用,但这会将您与特定的API联系起来。@ThingyWatsit:问题被标记为linux,因此我想codify需要一个特定于linux的答案。现在您已经编辑了该问题,答案已从“否”更改为“是”。顺便说一句,cp命令是用C编写的。谢谢!我编辑了这个问题,因为Linux系统调用和C系统库之间存在混淆。我希望这个问题现在是明确的。谢谢你的回答!我知道我们可以使用nftw遍历给定的目录,并对每个条目单独执行操作,但问题是-我们仍然在“打开目录中的每个文件以复制内容”,我做对了吗?。我需要一个跳过这个的方法。比如说,在dir1中有50个文件包含大量数据,需要在dir2中复制,我们应该能够复制它们,而不必担心文件的内容并打开它们。这不能实现吗?你不能避免open2复制一个文件。你看起来很困惑。我建议花几天时间阅读我链接的材料。我没有更多的时间和空间来解释,你需要花几天或几周的时间来阅读和学习。