C++ C++;FileIO复制-VS-系统(“cp file1.x file2.x”)

C++ C++;FileIO复制-VS-系统(“cp file1.x file2.x”),c++,linux,g++,filesystems,C++,Linux,G++,Filesystems,写一个文件复制例程会更快/更高效吗?还是我应该执行一个对cp的系统调用 (文件系统可能不同[nfs、local、reiser等],但它始终在CentOS linux系统上)通过自己的例程,您可以控制用于复制的块的大小,这是cp无法做到的。此外,您还可以生成不同的线程来读取和写入数据(以进一步加快进程)。最后,生成一个外部进程需要额外的时间(如果复制小文件,这一点很重要)。编写一个文件复制例程并不能节省时间 调用系统来shell一个cp是资源密集型的 通过找出可以进行的复制文件的系统(函数)调用,

写一个文件复制例程会更快/更高效吗?还是我应该执行一个对cp的系统调用


(文件系统可能不同[nfs、local、reiser等],但它始终在CentOS linux系统上)

通过自己的例程,您可以控制用于复制的块的大小,这是cp无法做到的。此外,您还可以生成不同的线程来读取和写入数据(以进一步加快进程)。最后,生成一个外部进程需要额外的时间(如果复制小文件,这一点很重要)。

编写一个文件复制例程并不能节省时间

调用系统来shell一个cp是资源密集型的


通过找出可以进行的复制文件的系统(函数)调用,您将得到更好的服务。例如,在Windows上,如果我没记错的话,它只是
CopyFile(src,dst)

C++文件IO更可移植,更低级,因此,它更灵活。

我想说的是,操作系统知道将文件A复制到文件B的最有效方法。这同样适用于任何api函数。

使用函数的A效率不高,也不太安全

在Linux中复制文件最有效的方法是使用系统调用。 在Windows上,应使用API函数或其相关变体之一

使用:

使用C++的例子:

ifstream f1(“input.txt”,fstream::binary);
流f2(“output.txt”,fstream::trunc | fstream::binary);

这似乎是OP想做的,通过执行系统调用。不,调用system()函数与进行系统调用不同。
system(“cp a.txt b.txt”)的执行路径
CopyFile(“a.txt”、“b.txt”)有很大不同在Windows上。我怀疑其他平台上也有类似的情况。在大多数情况下,复制文件应该留给操作系统。操作系统应该更高效,因为文件复制是它的人生目标之一。@Thomas,你说得对。我已经相应地更新了我的答案。谢谢。你会输的-操作系统是针对“一般”任务进行优化的,而对于几乎任何专门的任务都有优化的空间。在任何情况下,你都是在从一个位置复制字节到另一个位置。如何对其进行专门化或优化?很简单:如果您知道数据量、源设备和目标设备,您可以有效地并行读写。您可以将数据块的大小调整为非常大。您可以使用异步读写(至少在Windows上,所以这超出了这个特定问题的范围)。您可以通过内存映射文件进行复制(顺便说一句,这会更快)。可能会复制
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/sendfile.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main (int argc, char* argv[])
{
 int read_fd;
 int write_fd;
 struct stat stat_buf;
 off_t offset = 0;

 /* Open the input file. */
 read_fd = open (argv[1], O_RDONLY);
 /* Stat the input file to obtain its size. */
 fstat (read_fd, &stat_buf);
 /* Open the output file for writing, with the same permissions as the
   source file. */
 write_fd = open (argv[2], O_WRONLY | O_CREAT, stat_buf.st_mode);
 /* Blast the bytes from one file to the other. */
 sendfile (write_fd, read_fd, &offset, stat_buf.st_size);
 /* Close up. */
 close (read_fd);
 close (write_fd);

 return 0;
}
copy_file (source_path, destination_path, copy_option::overwrite_if_exists);
ifstream f1 ("input.txt", fstream::binary);
ofstream f2 ("output.txt", fstream::trunc|fstream::binary);
f2 << f1.rdbuf ();