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