C ++ FileIO Copy -VS- System ("cp file1.x file2.x) - PullRequest
12 голосов
/ 10 сентября 2010

Было бы быстрее / эффективнее написать подпрограмму копирования файла или я просто должен выполнить системный вызов cp?

(файловая система может отличаться [nfs, local, reiser и т. Д.], Однаковсегда будет в системе CentOS Linux)

Ответы [ 5 ]

22 голосов
/ 10 сентября 2010

Вызов a shell с использованием system () неэффективен и не очень безопасен.

Самый эффективный способ скопировать файл в 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 File System или 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 ();
1 голос
/ 10 сентября 2010

Писать подпрограмму копирования файла было бы неэффективно по времени.

Вызывать систему для оболочки процессора - это ресурсоемкий процесс.

Вы будете гораздо лучше справляться с задачей.системный (функциональный) вызов, который вы можете сделать, чтобы скопировать файл.Например, в Windows это просто CopyFile(src, dst), если я правильно помню.

0 голосов
/ 10 сентября 2010

Я бы положил деньги на то, что ОС знает наиболее эффективный способ копирования файла A в файл B. То же самое относится и к любым функциям API.

0 голосов
/ 10 сентября 2010

C ++ File IO более переносим и более низкоуровнев, поэтому он более гибок.

0 голосов
/ 10 сентября 2010

С помощью своей собственной процедуры вы можете контролировать размер блока, используемого для копирования, что вы не можете сделать с помощью cp.Кроме того, вы можете создавать различные потоки для чтения и записи данных (для дальнейшего ускорения процесса).Наконец, создание внешнего процесса занимает дополнительное время (важно, если вы копируете небольшие файлы).

...