关于linux:C ++ FileIO Copy -VS-系统(“cp file1.x file2.x)

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上它只是CopyFile(src, dst)


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


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


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