Duplicateur de fichiers

Soyez le premier à donner votre avis sur cette source.

Vue 5 944 fois - Téléchargée 280 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
Messages postés
16
Date d'inscription
mercredi 16 juillet 2003
Statut
Membre
Dernière intervention
29 octobre 2008

Le programme fonctionne mais ne copie pas chez moi, jérémy.
Messages postés
7
Date d'inscription
vendredi 6 octobre 2006
Statut
Membre
Dernière intervention
12 mai 2007

Corrigé.
Messages postés
7
Date d'inscription
vendredi 6 octobre 2006
Statut
Membre
Dernière intervention
12 mai 2007

Ca sera corrigé jeudi au plus tard.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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.