C++ FileIO Copy -VS- System("cp file1.x file2.x)
编写文件复制例程是否更快/更高效,还是应该只执行对cp的系统调用?
(文件系统可能有所不同[nfs,local,reiser等],但它总是在CentOS linux系统上)
使用system()函数调用shell效率不高且不太安全。
在Linux中复制文件的最有效方法是使用sendfile()系统调用。
在Windows上,应使用CopyFile()API函数或其相关变体之一。
使用sendfile的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #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 File System库或std :: fstream。
使用Boost的示例(更完整的示例):
1 | copy_file (source_path, destination_path, copy_option::overwrite_if_exists); |
使用C ++ std :: fstream的示例:
1 2 3 | ifstream f1 ("input.txt", fstream::binary); ofstream f2 ("output.txt", fstream::trunc|fstream::binary); f2 << f1.rdbuf (); |
编写文件复制例程并不是时间效率。
调用系统shell cp是资源密集型的。
通过确定可以复制文件的系统(函数)调用,您可以获得更好的服务。例如。如果我没记错的话,在Windows上它只是
我会把钱花在操作系统知道将文件A复制到文件B的最有效方法上。这同样适用于任何api函数。
C ++文件IO更便携,更低级,因此更灵活。
使用您自己的例程,您可以控制用于复制的块的大小,这是cp无法做到的。此外,您可以生成不同的线程来读取和写入数据(以进一步加快处理速度)。最后,产生外部进程需要额外的时间(如果复制小文件,则很重要)。