Подтвердить что ты не робот

С++ FileIO Copy -VS- System ("cp file1.x file2.x)

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

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

4b9b3361

Ответ 1

Вызов оболочка с помощью < Функция href= "http://linux.die.net/man/3/system" rel= "noreferrer" > system() не эффективна и не очень безопасна.

Самый эффективный способ скопировать файл в Linux - это использовать системный вызов sendfile(). В Windows следует использовать функцию CopyFile() или один из ее соответствующих вариантов.

Пример с помощью 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 library или std:: fstream.

Пример использования Boost (более полный пример):

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

Пример использования С++ std:: fstream:

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

Ответ 2

Неправильно было бы написать процедуру копирования файлов.

Это ресурсоемкий вызов системы для оболочки cp.

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

Ответ 3

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

Ответ 4

С++ File IO более портативный и более низкоуровневый, поэтому он более гибкий.

Ответ 5

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