Duplicateur de fichiers

2/5 (4 avis)

Vue 6 123 fois - Téléchargée 293 fois

Description

Programme servant à dupliquer n'importe quel fichier.
Faites glisser un fichier sur l'exécutable et entrer le nombre de copies désirées (INT_MAX au maximum).
Les fichiers copiés auront même nom et extension que le fichier original et seront normalement copiés dans le répertoire oû se situe l'exécutable.
N'oubliez pas le .zip.

Source / Exemple :


/* 0v3rb1t */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* taille du bloc en memoire */
#define TAILLE_BUFFER (1024*32)

/* Prototype de la fonction copie_fichier */
void copie_fichier(FILE *fichier_source, char chemin_absolu[]);

int main(int argc, char *argv[])
{
    FILE *fichier_source = NULL;

    /* Si l'utilisateur n'a pas fait glisser un fichier sur l'executable, on lui rappelle */
    if(argc<2)
    {
        printf("Faites glisser un fichier sur l'executable.");
        getchar();
        return EXIT_SUCCESS;
    }

    /* Ouverture du flux vers le fichier source */
    fichier_source = fopen(argv[1], "rb");

    /* Si l'ouverture a echoue on quitte */
    if(fichier_source==NULL)
    {
        fprintf(stderr, "erreur lors de l'ouverture du fichier source");
        getchar();
        exit(EXIT_FAILURE);
    }

    /* On appelle la fonction qui va dupliquer le fichier */
    copie_fichier(fichier_source, argv[1]);

    printf("Copie effectuee avec succes");
    getchar();

    return EXIT_SUCCESS;

}

void copie_fichier(FILE *fichier_source, char chemin_absolu[])
{
    int numero_fichier, taille_nom, nombre_copies, i, j, k;
    size_t longueur;
    char nom_fichier[100] = "", numero_fichier_caractere[10]= "", extension[10] = "";
    FILE *fichier_copie = NULL;
    /* On alloue un bloc de memoire necessaire a la copie du fichier source */
    unsigned char *zone_allouee = malloc(TAILLE_BUFFER);

    /* Si l'allocation a echouee on quitte */
    if(zone_allouee==NULL)
    {
        fprintf(stderr, "erreur lors de l'allocation de memoire");
        getchar();
        fclose(fichier_source);
        exit(EXIT_FAILURE);
    }

    /* On separe et stocke le nom et l'extension du fichier dans deux chaines differentes */
    for(i=0; chemin_absolu[i] != '\0'; i++)
    {

        if(chemin_absolu[i] == '.')
        {

            for(j=i; chemin_absolu[j] != '\\'; j--);

            j++;
            for(k=0; chemin_absolu[j] != '.'; j++, k++)
                nom_fichier[k] = chemin_absolu[j];

            for(k=0; chemin_absolu[j] != '\0'; j++, k++)
                extension[k] = chemin_absolu[j];

        }
    }

    taille_nom = strlen(nom_fichier);

    /* On demande le nombre de copies a l'utilisateur */
    do
    {
        printf("Nombre de copies: ");
        scanf("%d",&nombre_copies);
    }
    while(nombre_copies < 0);

    puts("");

    /* Boucle de duplication du fichier source */
    for(numero_fichier=0; numero_fichier < nombre_copies; numero_fichier++)
    {
        /* On initialise la chaine qui contient le numero du fichier a 0 */
        for(i=0;numero_fichier_caractere[i] != '\0'; i++)
        {
            numero_fichier_caractere[i] = 0;
        }
        /* On efface tous les caracteres se situant apres le nom du fichier */
        for(i=taille_nom;nom_fichier[i] != '\0'; i++)
        {
            nom_fichier[i] = 0;
        }

        /* On convertie le numero entier du fichier en sa representation sous forme de caracteres */
        sprintf(numero_fichier_caractere, "%d", numero_fichier+2);
        /* On concactene le numero du fichier a son nom */
        strcat(nom_fichier, numero_fichier_caractere);
        /* On concactene l'extension du fichier a son nom+numero */
        strcat(nom_fichier, extension);

        /* Ouverture du flux vers le fichier de copie */
        fichier_copie = fopen(nom_fichier, "wb");
        /* Si l'ouverture a echoue on quitte */
        if(fichier_copie==NULL)
        {
            fprintf(stderr, "erreur lors de l'ouverture du fichier copie");
            getchar();
            free(zone_allouee);
            fclose(fichier_source);
            exit(EXIT_FAILURE);
        }
        /* On copie le contenu du fichier source dans le fichier copie */
        while((longueur = fread(zone_allouee,1,TAILLE_BUFFER,fichier_source)) != 0)
        {
            fwrite(zone_allouee,1,longueur,fichier_copie);
        }

        /* On remet le curseur au debut du fichier source */
        rewind(fichier_source);
        /* On ferme le flux du fichier copie */
        fclose(fichier_copie);
    }
    /* Une fois les copies terminees on ferme le flux du fichier source */
    fclose(fichier_source);
    /* On libere la memoire allouee pour la copie du fichier source */
    free(zone_allouee);

}

Codes Sources

A voir également

Ajouter un commentaire Commentaires
cs_open Messages postés 16 Date d'inscription mercredi 16 juillet 2003 Statut Membre Dernière intervention 29 octobre 2008
10 juin 2007 à 17:15
Le programme fonctionne mais ne copie pas chez moi, jérémy.
0v3rb1t Messages postés 7 Date d'inscription vendredi 6 octobre 2006 Statut Membre Dernière intervention 12 mai 2007
1 mai 2007 à 17:10
Corrigé.
0v3rb1t Messages postés 7 Date d'inscription vendredi 6 octobre 2006 Statut Membre Dernière intervention 12 mai 2007
30 avril 2007 à 22:16
Ca sera corrigé jeudi au plus tard.
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 20
30 avril 2007 à 21:51
Comment ça "peut-être"...
J'y compte bien car c'est exactement l'exemple à ne pas suivre.
MAJ pour mercredi soir au plus tard sinon je serai contraint d'enlever.

Pour la Xieme fois: on ne lit ni n'écrit octet par octet. Tu aspires un buffer 32 Ko mini et tu replaques le nbr d'octets réellement lus.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.