C ++ FileIO Copy -VS-System (“cp fichier1.x fichier2.x)

Serait-il plus rapide / efficace d’écrire une routine de copie de fichier ou devrais-je simplement exécuter un appel système à cp?

(Le système de fichiers pourrait différer [nfs, local, reiser, etc.], mais il serait toujours sur un système Linux CentOS)

Invoquer un shell en utilisant la fonction system () n’est pas efficace et pas très sécurisé.

Le moyen le plus efficace de copier un fichier sous Linux consiste à utiliser l’appel système sendfile () . Sous Windows, la fonction API CopyFile () ou l’une de ses variantes associées doit être utilisée.

Exemple utilisant sendfile :

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

Si vous ne voulez pas que votre code dépende de la plate-forme, vous pouvez vous en tenir à des solutions plus portables – la bibliothèque Boost File System ou std :: fstream .

Exemple d’utilisation de Boost ( exemple plus complet ):

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

Exemple utilisant C ++ std :: fstream :

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

Il ne serait pas temps d’écrire une routine de copie de fichiers.

L’appel du système à un shell cp nécessite beaucoup de ressources.

Vous serez bien mieux servi en définissant l’appel système (fonction) que vous pouvez effectuer pour copier le fichier. Par exemple, sur Windows, il n’y a que CopyFile(src, dst) si je me souviens bien.

Avec votre propre routine, vous pouvez contrôler la taille du bloc utilisé pour la copie, ce que vous ne pouvez pas faire avec cp. En outre, vous pouvez générer différents threads pour lire et écrire des données (pour accélérer le processus). Enfin, générer un processus externe prend du temps supplémentaire (important si vous copiez des petits fichiers).

C ++ File IO est plus portable et de bas niveau, il est donc plus flexible.

Je mettrais mon argent sur ce que le système d’exploitation connaît le moyen le plus efficace de copier le fichier A dans le fichier B. Il en va de même pour toutes les fonctions de l’API.