Copie de fichier, gérant l'existence du fichier destination
#include "t_bool.h" #include "file_tools.h" #include <stdlib.h> #include <stdio.h> #include <string.h> /* Nom du fichier temporaire. */ #define TEMP_FILE "example.txt" /* Liste, non exhaustive, de delimiteurs */ #define DELIM " *§:/;!.,?&~<>{([|])}\"\\+=" /* ---------------------------------------------------- file_tools_copy ---------------------------------------------------- Copie d'un fichier. ---------------------------------------------------- arg : Fichier source. arg : Fichier destination. arg : Mode de protection pour le fichier de destination. return: true si la copie est un succes sinon false. ---------------------------------------------------- */ t_bool file_tools_copy (char const * const s_src, char const * const s_dest, file_tools_protect_mode mode) { FILE * p_file_src = NULL; FILE * p_file_dst = NULL; char * s_buffer = NULL; int nb_read = 0; t_bool bool = true; /* ----- Verification des arguments ----- */ if (!s_src || !s_dest) { /* Erreur: arguments invalides. */ return false; } /* ----- Test de l'existence du fichier de destination ----- */ if (mode == FILE_TOOLS_NO_OVERWRITING) { if (file_tools_exist (s_dest)) { /* Erreur: le fichier de destination existe deja. */ return false; } } /* Ouverture du fichier de destination. */ p_file_src = fopen (s_src, "rb"); if (!p_file_src) { /* Erreur: impossible d'ouvrir le fichier source. */ return false; } /* Ouverture du fichier de destination. */ p_file_dst = fopen (s_dest, "wb"); if (!p_file_dst) { /* Erreur: impossible de creer le fichier de destination. */ fclose (p_file_src); return false; } /* ----- Allocation du buffer temporaire ----- */ s_buffer = malloc (BUFSIZ); if (!s_buffer) { /* Erreur: impossible d'allouer l'espace requis. */ fclose (p_file_src); fclose (p_file_dst); remove (s_dest); return false; } /* ----- */ /* ----- Copy du contenu du fichier source vers la destination ----- */ while ((nb_read = fread (s_buffer, 1, BUFSIZ, p_file_src)) != 0) { fwrite (s_buffer, 1, nb_read, p_file_dst); memset (s_buffer, 0, sizeof (s_buffer)); } /* Fermeture des fichiers. */ fclose (p_file_src); fclose (p_file_dst); /* Liberation du buffer. */ free (s_buffer); s_buffer = NULL; return bool; }
Vous pouvez retrouver cette fonction ainsi que toutes les autres fonctions de la catégorie Fichier dans l'archive file_tools.zip.
L'archive comprends les fichiers suivants :
- example1.txt et example2.txt deux fichiers utilisés par la méthode main.
- t_bool.h : déclaration du type booléen.
- file_tools.h et file_tools.c : déclaration et implémentation des fonctions de la catégorie Fichier.
- main.c : fonction permettant et mettant en œuvre l'ensemble des fonctions Fichier.
Exécution
$gcc main.c file_tools.c -o filetools $chmod +x filetools $./filetools