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

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

文件系统可以不同[nfs,local,reiser等],但是它总是在CentOS linux系统上)

Solutions Collecting From Web of "C ++ FileIO复制-VS-系统(“cp file1.x file2.x)"

通过使用system()函数调用一个shell是不高效的,不是很安全。

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

使用sendfile的 示例 :

#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; } 

如果你不想让你的代码依赖于平台,你可以坚持更便携的解决方案 – Boost文件系统库或std :: fstream 。

使用Boost的例子 ( 更完整的例子 ):

 copy_file (source_path, destination_path, copy_option::overwrite_if_exists); 

使用C ++ std :: fstream的示例:

 ifstream f1 ("input.txt", fstream::binary); ofstream f2 ("output.txt", fstream::trunc|fstream::binary); f2 << f1.rdbuf (); 

编写文件复制例程不是时间效率高。

调用系统来调用一个cp是耗费资源的。

通过计算可以复制文件的系统(函数)调用,可以更好地服务于此。 例如在Windows上CopyFile(src, dst)如果我记得正确的话CopyFile(src, dst)它就是CopyFile(src, dst)

用你自己的例程,你可以控制用于复制的块的大小,这是你不能用cp做的。 此外,你可以产生不同的线程读取和写入数据(进一步加快进程)。 最后,产生一个外部过程会花费额外的时间(重要的是如果你复制小文件)。

C ++文件IO更便携,更低级,因此更加灵活。

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