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
file_tools.zip