Structure logique globale
- Analyser les arguments de ligne de commande pour obtenir les chemins du fichier source et de destination.
- Ouvrir le fichier source en mode binaire lecture seule et créer/écraser le fichier destination en mode binaire écriture seule.
- Utiliser une boucle avec tampon pour lire le contenu du fichier source, puis écrire ce contenu dans le fichier destination.
- Vérifier les erreurs pendant les opérations de lecture/écriture pour assurer l'intégrité de la copie.
- Fermer les deux fichiers après la copie pour libérer les ressources.
Code d'implémentation
Ouverture du fichier source (lignes 19-23)
La fonction fichier_source = ouvrir_fichier(argv[1], "rb") ouvre le fichier source. Le premier argument (argv[1]) représente le chemin/nom du fichier source (par exemple, lors de l'exécution du programme avec ./copier source.txt destination.txt, argv[1] serait source.txt).
Ouverture du fichier destination (lignes 26-31)
De même, la fonction fichier_dest = ouvrir_fichier(argv[2], "wb") ouvre le fichier destination.
Points importants
- Si l'ouverture du fichier destiantion échoue (problèmes de permissions, disque plein), il est impératif de fermer d'abord le fichier source avec
fermer_fichier(fichier_source)avant de quitter le programme. <>Ne pas fermer le fichier source entraînerait une "fuite des descripteurs de fichier" (les ressources système resteraient occupées jusqu'à la fin du programme).
Définition du tampon
char tampon[TAILLE_TAMPON];
size_t octets_lus;
tampon[1024]: Stocke temporairement les données lues depuis le fichier source avant de les écrire dans le fichier destination.size_t octets_lus: Type entier non signé utilisé pour représenter des tailles/octets. Il évite les problèmes de valeurs négatives.- Fonction : Stocke le nombre réel d'octets lus à chaque opération depuis le fichier source.
Opérations de lecture et d'écriture
Opération de lecture
octets_lus = lire_donnees(tampon, 1, sizeof(tampon), fichier_source);
Paramètres :
tampon: Zone de stockage pour les données lues (pointeur de typechar*automatiquement converti envoid*)1: Taille de chaque unité de données lue (1 octet)sizeof(tampon): Nombre d'unités à lire (1024 unités, soit jusqu'à 1024 octets)fichier_source: Pointeur vers le fichier source
Opération d'écriture
size_t octets_ecrits = ecrire_donnees(tampon, 1, octets_lus, fichier_dest);
Paramètres :
tampon: Source des données à écrire (les données venant de la lecture)1: Taille de chaque unité de données écrite (1 octet)octets_lus: Nombre d'unités à écrire (seulement le nombre d'octets réellement lus, pour éviter d'écrire des données non utilisées du tampon)fichier_dest: Pointeur vers le fichier destination
Valeur de retour : Nombre réel d'unités écrites avec succès (égal au nombre d'octets écrits).
Vérification de l'écriture
if (octets_ecrits != octets_lus) {
afficher_erreur("Échec de l'écriture");
break;
}
- Fonction : S'assure que tous les octets lus sont correctement écrits dans le fichier destination.
- En cas d'inégalité (disque plein, permissions révoquées), affiche une erreur et sort de la boucle pour éviter une copie incomplète.
Résumé
Le rôle du tampon et des variables octets_lus et octets_ecrits est de stocker temporairement les données du fichier source et de suivre la quantité de données traitées. Cette vérification permet d'assurer que toutes les données lues sont bien écrites dans le fichier destination.