IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Executable pour transfert de fichier automatique


Sujet :

C

  1. #21
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    En tapant recup[i]

    Je récupère uniquement la première sous chaîne de la fonction strtok.

    Les autres ne le sont pas...

    Si je tape comme nom de fichier "HYE_20080911_080000.tc"

    La console affiche le texte suivant :

    HYE
    20080911
    080000
    tc
    HYE

    comment faire pour obtenir :

    HYE20080911080000tc à la place de HYE

  2. #22
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Ca aussi je crois on te l'a déjà dit pourquoi ...
    Citation Envoyé par souviron34 Voir le message
    Attention à la fonction strtok , qui modifie la chaîne entrée (met un caractère '\0' (fin de chaîne) à chaque séprateur rencontré), et rend donc la chaîne inutilisable pour la suite...

    Si c'est une chaîne dont on ne sert qu'une fois, pas de problèmes.

    Si elle est réutilisée plus tard (par exemple le nom du fichier), il faut la dupliquer avant d'appeler strtok (par exemple avec strdup ou strcpy)
    Avant de passer une chaîne à strtok, il faut en faire une sauvegarde si on souhaite encore l'utiliser plus tard ...

  3. #23
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    Melem pour le tableau mutlidimensionnel c'est bon ça fonctionne. J'ai réussi aussi à sauvegarder les sous chaînes dans un tableau recup [3][50] grâce à strcpy.

    J'obtiens donc :
    recup[0] = 'HYE'
    recup[1] = '20080911'
    recup[2] = '080000'
    recup[3] = 'tc'

    Le tableau recup est composé de sous chaine. Je souhaiterai stoquer HYE dans une chaine de caractère appelée char site [3] pour pouvoir manipuler plus tard 2008 et 09 séparément.

    En tapant le code suivant recup[0]=site;

    Le compilateur me dit : "forbids assignement of arrays"

    J'ai regardé sur des sites, cela signifie que la copie de tableau se ferait avec strncpy...

  4. #24
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    J'ai regardé sur des sites, cela signifie que la copie de tableau se ferait avec strncpy...
    Tu viens de l'apprendre ? C'est pas trop tôt.

    Tutoriel : Les chaînes de caractères.

  5. #25
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    #include <stdio.h>
    #include <string.h>
     
    int main(int argc, char *argv[])
    {
        int i=0,j=0,k=0,chiffre;
        char site[50], annee[3], mois[1], date[50], heure[50], extension[50]; 
        char recup [3][50]; // Déclaration d'un tableau mutlidimensionnel pour récuperer les sous chaines
        char lpBuffer[100], separators[] = " _.\n", *p;
     
        printf("Entrez une chaine de caracteres : "); // Taper HYE_20080911_080000.tc
        fgets(lpBuffer, sizeof(lpBuffer), stdin);
     
        printf("\nAffichage des sous chaines avec strtok\n");
     
        p = strtok(lpBuffer, separators);
     
        while(p != NULL)
        {
            strcpy(recup[i],p);
            printf("%s\n", p);
            i++;
            p = strtok(NULL, separators);
        }
     
        printf("\n");
        for(k=0;k<4;k++)
        printf("%s\t",recup[k]);
     
        printf("\n\n");
        strcpy(site,recup[0]);
        strcpy(date,recup[1]);
        strcpy(heure,recup[2]);
        strcpy(extension,recup[3]);
     
        printf("site : %s\t",site);
        printf("date : %s\t",date);
        printf("heure : %s\t",heure);
        printf("extension : %s\n",extension);
     
        printf("\n");
     
     
        for(i=0;i<4;i++)
        annee[i]=date[i];
     
        for(i=4;i<6;i++)
        {
         mois[j]=date[i];
         j++;
        }    
     
     
     
     
        for(i=0;i<4;i++) \\ affichage du tableau annee pour verification
        printf("%c",annee[i]);
     
        printf("\n");
     
        for(i=0;i<2;i++)  \\ affichage du tableau mois pour verification
        printf("%c",mois[i]);
     
        printf("\n");
     
        scanf("\n%d",&chiffre); // Met le programme en pause pour vérifier
     
      return 0;
    }


    Et voila ce que j'obtiens en console, un petit problème au niveau de la copie de l'année le 2008 est remplacé par un curieux 9008...



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    Entrez une chaine de caracteres : HYE_20080911_080000.tc
    
    Affichage des sous chaines avec strtok
    HYE
    20080911
    080000
    
    HYE	20080911	080000	tc
    
    site : HYE	date : 20080911	heure : 080000	extension : tc
    
    9008
    09
    tc
    J'ai pourtant vérifier avec un printf la valeur de date[0], elle vaut bien "2".

    Le plus important c'est : quand je déclare un tableau : " char mois[1]" lorsque je voudrai savoir s'il y a bien 2 cases en mémoires pour stocker par exemple ici le "09" du mois de septembre?

    Je pose cette question parceque quand je fais un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%s",mois);
    J'obtiens bien mon 09 tant attendu mais suivi de hiéroglyphes bizarre... Ca correspondrai aux valeurs aléatoires présente en mémoire à cet endroit la ?

  6. #26
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char site[50], annee[3], mois[1], date[50], heure[50], extension[50];
    Dans une année il y a 4 chiffres, une chaîne année comporte donc 5 caractères : les 4 chiffres + le caractère '\0' qui doit terminer toute chaîne de caractères. Un moins est composé de deux chiffres dans une chaîne mois comporte 3 caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char ... annee[5], mois[3], ...;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(i = 0; i < 4; i++)
        annee[i] = date[i];
    On copie les 4 premiers caractères de date puis on termine la chaîne par '\0' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(i = 0; i < 4; i++)
        annee[i] = date[i];
     
    annee[4] = '\0';
    La boucle (les deux premières lignes) qui pouvait s'écrire également : strncpy(annee, date, 4);

    Pareil pour mois (en plus vaut mieux avoir l'initialisation de j sous les yeux. On peut mettre également j++ juste à côté de i++) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i = 4, j = 0; i < 6; i++, j++)
        mois[j] = date[i];
     
    mois[2] = '\0';
    Les commentaires en C99 sont /* ... */ ou // ... mais sûrement pas \\ ...

    Tu compliques inutilement l'affichage des chaînes à la fin de ton programme.

    Ca ne sert à rien de mettre le programme en pause avant de quitter. Une application console se lance depuis une console déjà ouverte. Si c'est pour déboguer, tu peux mettre system("pause"); vu que t'es sous Windows. system est déclaré dans stdlib.h. C'est mieux que ta solution actuelle.

  7. #27
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    Franchement melem c'est mon anniversaire aujourd'hui et je viens de lire ton post C'est vraiment super merci merci beaucoup ! J'avais pas pensé à copier un caractère de fin de chaine pour faire "propre" et éviter les caractères de trop !

    Merci beaucoup pour ce post qui est ultra clair !

    Une bonne fin de week end à toi et encore merci !

    On continue !

  8. #28
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    /* Déclarations */
     
        HANDLE hEnt;
        WIN32_FIND_DATA ent;
        int i=0,j=0,k=0,chiffre;
        char site[50], annee[5], mois[3], date[50], heure[50], extension[50], utilisateur[3]; 
        char recup [3][50];
        char lpBuffer[100], separators[] = " _.\n", *p;
     
        /* Partie qui determine avec deux questions l'extension du fichier à copier.
        Cette extension détermine à elle seule le chemin d'accès des donnees dans le disque dur externe */
     
        printf(" ----- Tapez la Nature des fichiers a copier ----- \n");
        printf(" b = Bulle ; t = Tulle ; g = Gulle \n");
        scanf("%c",&utilisateur[0]);
        fflush (stdin); /* Vide le buffer d'entree */ 
        printf(" ----- Tapez le Type de fichiers a copier ----- \n");
        printf(" c = Court ; l = Long ; e = Encoupe ; t = Taper \n");
        scanf("%c",&utilisateur[1]);
        fflush (stdin);
        utilisateur[2]='\0';
     
        if (strcmp (utilisateur, "bt")==0)
        {
                   printf(" \n Vous avez choisi des donnees gulles courts \n"); 
                   if ((hEnt = FindFirstFile("E:\\donnees\\bulles\\taper\\*.*", &ent)) != INVALID_HANDLE_VALUE)
                   { 
                             do
                             printf("%s\n", ent.cFileName);
                             while (FindNextFile(hEnt, &ent));
     
                             FindClose(hEnt);
                             }
        }
    Ici le programme, si l'on tape "b" pour la nature puis "t" pour taper. le programme me liste bien le contenu dans le disque dur externe E:

    Cependant j'aimerai non pas lister mais effectuer différentes étapes pour tous les fichiers contenu dans l'arborescence :

    1) extraire le nom du fichier, lui appliquer mon programme avec les fonctions strtok, strcpy pour créer un tableau avec en t[0] = l'extension (exemple : tc) , t[1] = l'annee (2008), t[2] = le mois (09), t[3] = le site (HYE). Jusque la, je sais faire tout fonctinne niquel !

    Ce tableau me permettra de créer l'arborescence avec la fonction if ( ... && ... && ... && ) pour créer la nouvelle arborescence de copie du fichier.
    exemple bidon juste pour bien comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (strcmp (extension, "gc")==0 && strcmp (annee, "2008")==0 && strcmp (mois, "09")==0 && strcmp (site, "HYE")==0)
    Ajouter ensuite :
    fonction copie de fichier (que je connais pas) dans l'arborescence E:\extension_gc\2008\09\HYE.

    2) Copier justement ce fichier et répéter cette étape pour n fichiers trouvés...

    Merci d'avance

  9. #29
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    fonction copie de fichier (que je connais pas)
    CopyFile. Regarde dans la FAQ Win32.

  10. #30
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    char recup [3][50];
    char lpBuffer[100], separators[] = " _.\n", *p;
    printf("\nEntrez une chaine de caracteres : "); // Taper HYE_20080911_080000.tc
        fgets(lpBuffer, sizeof(lpBuffer), stdin);
     
        printf("\nAffichage des sous chaines avec strtok\n");
     
        p = strtok(lpBuffer, separators);
     
        while(p != NULL)
        {
            strcpy(recup[i],p);
            printf("%s\n", p);
            i++;
            p = strtok(NULL, separators);
        }
    dans ce code, tout fonctionne niquel, seulement je tape un nom de fichier, qui est stoqué dans lpBuffer[100]. J'aimerai améliorer cette fonction, c'est à dire au lieu de rentrer un nom de fichier, j'aimerai trouver une fonction qui me copie le nom de ce fichier (ex : HYE_20080911_080000.tc) dans lpBuffer[100]. Et si possbile répéter cette action pour tous les fichiers présents dans un dossier... Je fais des recherches mais ça devient de plus en plus pointilleux.

  11. #31
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    C'est bon j'ai réussi, dans la boucle du listage de fichier, j'ai rajouté un strcpy et ça marche.

  12. #32
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    if (strcmp (utilisateur, "gc")==0)
        {
                   printf(" \n Vous avez choisi des donnees gulles courts \n"); 
                   if ((hEnt = FindFirstFile("E:\\donnees\\bulles\\taper\\*.*", &ent)) != INVALID_HANDLE_VALUE)
                   { 
                             do
                             {
                             printf("%s\n", ent.cFileName);
                             strcpy(lpBuffer,ent.cFileName);
                             p = strtok(lpBuffer, separators);
                             printf("\nAffichage des sous chaines avec strtok\n");
                             while(p != NULL)
                                     {
                                             i=0;
                                             strcpy(recup[i],p);
                                             printf("%s\n", p);
                                             i++;
                                             p = strtok(NULL, separators);
                                     }
                                     strcpy(site,recup[0]);
                                     strcpy(date,recup[1]);
                                     strcpy(heure,recup[2]);
                                     strcpy(extension,recup[3]);
                                     printf("Verification avant decoupage mois annee\n");
                                     printf("site : %s\t",site);
                                     printf("date : %s\t",date);
                                     printf("heure : %s\t",heure);
                                     printf("extension : %s\n",extension);
                                        /* Partie decoupage date en mois et annee */
                                     for(i=0;i<4;i++)
                                     {
                                     annee[i]=date[i];
                                     }
                                     annee[4]='\0';
                                     for (i=4, j=0; i<6; i++, j++)
                                     {
                                     mois[j]=date[i];
                                     }
                                     mois[2]='\0';
                                     printf("site : %s\n",site);
                                     printf("extension : %s\n",extension);
                                     printf("mois : %s\n",mois);
                                     printf("annee : %s\n",annee);
                                     printf("\n\n\n"); 
                             }
                             while (FindNextFile(hEnt, &ent));
     
                             FindClose(hEnt);
                             }
        }
    printf("\n\n\n");
    system("PAUSE");	
    return 0;
    }
    Et voila ce que j'obtiens dans ma console.

    Affichage des sous chaines avec strtok
    TOU
    20080911
    151000
    gc
    Verification avant decoupage mois annee
    site : gc date : heure : extension :
    site : gc
    extension :
    mois :
    annee :


    Appuyer sur une touche pour continuer ...


    ps: Je n'ai affiché qu'une partie de la console vu qu'il y avait plusieurs fichiers dans le dossiers. seulement je voulais attirer votre attention sur l'affichage des donnée date : heure : et extension : qui sont ... vide !

    Alors que tout fonctionnait bien. Le nom du fichier est bien copié dans lpBuffer.
    La fonction strtok est Ok vu l'affichage sans les séparateurs.
    La sauvegarde de ces sous chaînes a fonctionné dans un autre programme qui ne rentré pas dans la boucle do { ... } while de la fonction du listage de dossier de ce programme.
    Le seul constat que je peux faire, c'est qu'il y a un décalage. Mais je vois pas où est le problème...

    Merci d'avance

  13. #33
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 615
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 615
    Billets dans le blog
    2
    Par défaut
    ton i=0 est dans le while.....


  14. #34
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    Merci souviron, j'ai tellement cherché tout et n'importe quoi que je n'ai pas remarqué !

    Sinon je voulais savoir : quand je fais un listing de fichier il m'affiche ceci dans la console :

    .
    ..
    et ensuite tous mes fichiers niquel.

    A quoi correspond ces points ?

  15. #35
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 615
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 615
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Hayden5127 Voir le message
    Merci souviron, j'ai tellement cherché tout et n'importe quoi que je n'ai pas remarqué !

    Sinon je voulais savoir : quand je fais un listing de fichier il m'affiche ceci dans la console :

    .
    ..
    et ensuite tous mes fichiers niquel.

    A quoi correspond ces points ?
    . est le répertoire courant
    .. est le répertoire au dessus.

  16. #36
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    Super merci !

    La je m'attaque à la aprtie la plus difficile de mon programme :

    Créer l'arborescence finale en fonction de plusieurs conditions.

    J'ai copié l'extension de mon fichier dans un tableau appelé extension. Idem pour l'année, le mois, le site.

    L'idée serait d'écrire dans un fichier ou de créer un tableau de chaîne de caractère qui ne sera autre que l'arborescence finale de la copie.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ( extension == "gc")
    alors je commence à écrire l'arborescence de copie : C:\\serveur\\gulles\\courts

    et ensuite exécuter une autre conditon par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ( annee == "2008")
    Continuer à écrire dans un fichier par exemple, l'arborescence finale, je pense à une concaténation en rajoutant "\\" à chaque fois.

    L'arborescence deviendrai donc : C:\\serveur\\gulles\\courts\\2008

    etc.

    Et je rencontre de nombreux problèmes : les conditions sur ma chaîne de caractère ne fonctionnent pas.
    Quel serait la meilleur stratégie pour écrire l'arborescence ? fprintf ? tableau de chaîne de caractère ?
    Et ensuite dans la fonction CopyFile, il faut écrire le chemin d'accès, mais est ce qu'on peut le remplacer par un fichier ou tableau qui contient le chemin?
    (ex : Remplacer :
    CopyFile("c:\\source\\fichier.exe", "c:\\dest\\fichier.exe", 0);
    Par : CopyFile(ent,dossier_dest,0); où ent représente le fichier dans le listing et dossier_dest un tableau ou fichier avec le chemin.

    Merci d'essayer de me guider, je poursuis mes recherche de mon côté.

  17. #37
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 615
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 615
    Billets dans le blog
    2
    Par défaut
    une comparaison avec une chaîne de caractères ne s'ffectue pas avec ==, mais avec strcmp...

  18. #38
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <windows.h>
     
    int main(int argc, char *argv[])
    {
        /* Déclarations */
     
        HANDLE hEnt;
        WIN32_FIND_DATA ent;
        char chemin_site_HYE[]="Hye\\";
        char chemin_site_DA[]="Da\\";
        char chemin_mois_1[]="1\\";
        char chemin_mois_2[]="2\\";
        char chemin_mois_3[]="3\\";
        char chemin_mois_4[]="4\\";
        char chemin_mois_5[]="5\\";
        char chemin_mois_6[]="6\\";
        char chemin_mois_7[]="7\\";
        char chemin_mois_8[]="8\\";
        char chemin_mois_9[]="9\\";
        char chemin_mois_10[]="10\\";
        char chemin_mois_11[]="11\\";
        char chemin_mois_12[]="12\\";
        char chemin_annee_2007[]="2007\\";
        char chemin_annee_2008[]="2008\\";
        char chemin_annee_2009[]="2009\\";
        char chemin_annee_2010[]="2010\\";
        char chemin_source_9[]="F:\\donnees\\goniometrie\\courts\\";
        char chemin_destination[100];
        int i=0,j=0,k=0,l=2,chiffre;
        char site[50], annee[5], mois[3], date[50], heure[50], extension[50], utilisateur[3]; 
        char recup [3][50];
        char lpBuffer[100], nom_fichier_copie[100], separators[] = "_.\n", *p;
     
    printf(« Tapez gc\n ») ;
    scanf(« %s,utilisateur) ; /* Le fait de faire taper à l'utilisateur gc,détermine directement l'arborescence ou l'on doit lister et copier les fichiers */
    if (strcmp (utilisateur, "gc")==0)
        {
     
                   printf("\nVous avez choisi des donnees goniometriques courts \n\n\n");
                   if ((hEnt = FindFirstFile("F:\\donnees\\goniometrie\\courts\\*.*", &ent)) != INVALID_HANDLE_VALUE)
                   { 
                             do
                             {
                             printf("%s\n", ent.cFileName);
                             strcpy(lpBuffer,ent.cFileName);
                             p = strtok(lpBuffer, separators);
                             printf("\n\nAffichage des sous chaines avec strtok\n\n");
                             i=0;
                             while(p != NULL)
                                     {
                                             strcpy(recup[i],p);
                                             printf("%s\n", p);
                                             i++;
                                             p = strtok(NULL, separators);
                                     }
                                     strcpy(site,recup[0]);
                                     strcpy(date,recup[1]);
                                     strcpy(heure,recup[2]);
                                     strcpy(extension,recup[3]);
                                        /* Partie decoupage date en mois et annee */
                                     for(k=0;k<4;k++)
                                     {
                                     annee[k]=date[k];
                                     }
                                     annee[4]='\0';
                                     for (k=4, j=0; k<6; k++, j++)
                                     {
                                     mois[j]=date[k];
                                     }
                                     mois[2]='\0';
                                     printf("\n\nsite : %s\n",site);
                                     printf("extension : %s\n",extension);
                                     printf("mois : %s\n",mois);
                                     printf("annee : %s\n",annee);
                                     printf("\n\n\n"); 
    /* Ajout de conditions pour déterminer l’arborescence de copie ! Ca marche niquel ! */
                                     char chemin_destination[]="G:\\executable\\SERVEUR\\goniometrie\\courts\\";
                                     if (strcmp(annee,"2008")==0)
                                     {
                                        strcat(chemin_destination,chemin_annee_2008);
                                        printf("\nevoltion chemin destination : %s\n",chemin_destination);
                                     }
                                     if (strcmp(annee,"2009")==0)
                                     {
                                        strcat(chemin_destination,chemin_annee_2009);
                                        printf("\nevoltion chemin destination : %s\n",chemin_destination);
                                     }
                                     if (strcmp(mois,"09")==0)
                                     {
                                        strcat(chemin_destination,chemin_mois_9);
                                        printf("\nevoltion chemin destination : %s\n",chemin_destination);
                                     }
                                     if (strcmp(mois,"12")==0)
                                     {
                                        strcat(chemin_destination,chemin_mois_12);
                                        printf("\nevoltion chemin destination : %s\n",chemin_destination);
                                     }
                                     if (strcmp(site,"HYE")==0)
                                     {
                                        strcat(chemin_destination,chemin_site_HYE);
                                        printf("\nevoltion chemin destination : %s\n",chemin_destination);
                                     }
                                     if (strcmp(site,"DAK")==0)
                                     {
                                        strcat(chemin_destination,chemin_site_DAK);
                                        printf("\nevoltion chemin destination : %s\n",chemin_destination);
                                     }
    /* la partie la plus delicate, la chaine chemin_source_9 :( */
                                     CopyFile(chemin_destination,chemin_source_9,0);
                             }
                             while (FindNextFile(hEnt, &ent));
     
                             FindClose(hEnt);
                             }
    Donc tout marche superbement bien ! Plusieurs problèmes rencontrés.
    Le fait que la fonction liste les noms des fichiers, il y a déjà les "."et ".." signifiant les repertoires courant et du dessus qui sont assez génants. Est ce possible de les enlever ?

    Ensuite, beaucoup plus important, étant donné que j'ai créé le chemin source avec la variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char chemin_source_9[]="F:\\donnees\\goniometrie\\courts\\";
    j'ai plus qu'a concaténer le nom du fichier en cours de listage ce qui me permettrait de copier avec la fonction CopyFile le fichier en cours de listage !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    strcat(chemin_source_9,ent.cFileName);
    CopyFile(chemin_destination,chemin_source_9);
    Le problème c'est que comme on est dans une boucle do while, tous les noms de fichiers vont y passer ! J'obtiens donc dans la console

    affichage chemin source pour verification : F:\\donnees\\goniometrie\\courts\\...HYE_20080911_080000.tcHYE20080911_090000.tc etc...

    La solution serait elle de stoquer le nom du fichier dans un autre tableau, copier dans une chaine ce nom et le mettre dans strcat pour qu'il prenne uniquement CE fichier en compte ?...

    Je n'ai pas d'idée, et le plus frustrant c'est que si ca fonctionne mon programme est quasiment terminé !!

    Merci pour vos suggestions.

  19. #39
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    il y a déjà les "."et ".." signifiant les repertoires courant et du dessus qui sont assez génants. Est ce possible de les enlever ?
    Oui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (ent.cFileName DIFFERENT_DE "." ET ent.cFileName DIFFERENT_DE "..")
    {
        /* Faire le traitement. */
    }
    T'as perdu tes réflexes ?

    Ensuite, beaucoup plus important, étant donné que j'ai créé le chemin source avec la variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char chemin_source_9[]="F:\\donnees\\goniometrie\\courts\\";
    j'ai plus qu'a concaténer le nom du fichier en cours de listage ce qui me permettrait de copier avec la fonction CopyFile le fichier en cours de listage !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strcat(chemin_source_9,ent.cFileName);
    CopyFile(chemin_destination,chemin_source_9);
    Le problème c'est que comme on est dans une boucle do while, tous les noms de fichiers vont y passer ! J'obtiens donc dans la console
    Normalement tu ne devrais pas modifier chemin_source_9 car tu en auras toujours besoin ... je pense. A part ça, tu te sers mal de strcat. La chaîne "F:\\donnees\\goniometrie\\courts\\" comportant 31 caractères (y compris le '\0') si j'ai bien compté, la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char chemin_source_9[] = "F:\\donnees\\goniometrie\\courts\\";
    Est strictement identique à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char chemin_source_9[31] = "F:\\donnees\\goniometrie\\courts\\";
    Le 31 a été automatiquement ajouté par le compilateur. Il n'y a donc plus assez de place dans chemin_source_9 pour y ajouter quoi que ce soit. T'aurais donc du écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char chemin_source_9[1000] = "F:\\donnees\\goniometrie\\courts\\";
    Voilà enfin un tableau assez grand. Peut-être même trop grand, je te conseille donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char chemin_source_9[MAX_PATH] = "F:\\donnees\\goniometrie\\courts\\";
    MAX_PATH étant une macro définie dans l'un ou l'autre des fichiers inclus par windows.h. Pas la peine de t'expliquer son rôle, à moins que tu ne connaisses rien à l'anglais .

  20. #40
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 615
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 615
    Billets dans le blog
    2
    Par défaut
    Ta solution est correcte, mais moi je conseillerais plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char chemin_source_9[] = "F:\\donnees\\goniometrie\\courts\\";
    char nom_complet[1000] ;
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sprintf(nom_complet, "%s%s", chemin_source_9,ent.cFileName);
    CopyFile(chemin_destination,nom_complet);
    Et même on peut faire de l'allocation dynamique si on veut...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Caractères générique pour transfert de fichiers avec PSFTP
    Par yellowdog dans le forum Windows Serveur
    Réponses: 0
    Dernier message: 05/05/2011, 14h21
  2. API pour transfert de fichier via port série
    Par Vanatou dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 27/05/2010, 15h38
  3. [Labview 2009] Aide pour transfert de fichier (ftp)
    Par loicdu30 dans le forum LabVIEW
    Réponses: 4
    Dernier message: 05/12/2009, 11h10
  4. renseignement pour lancéer un fichier automatiquement tous les jours en bash
    Par sinifer dans le forum Applications et environnements graphiques
    Réponses: 20
    Dernier message: 09/06/2009, 12h31
  5. Amsn incompatible avec msn messenger pour transfert de fichier
    Par tonelli dans le forum Mandriva / Mageia
    Réponses: 4
    Dernier message: 09/11/2006, 17h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo