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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Executable pour transfert de fichier automatique
    Pour une meilleure compréhension du problème veuillez ouvrir les pièces jointes, afin de bénéficier des exemples en couleur et des schémas très utiles à la compréhension de la demande.


    Bonjour,

    Je souhaiterai créer un programme de transfert automatique de fichier d’une clé usb à un serveur avec pour contrainte principal le respect d’une arborescence bien précise dans le serveur.

    A noter que le nom du fichier a été créé pour qu’il détermine à lui tout seul la destination finale de la copie de ce fichier dans l’arborescence du serveur.

    Le programme devra donc dans un premier temps « scanner » le nom du fichier, selon des règles bien précises, il va déterminer point par point le chemin d’accès et le copier au bon endroit dans le serveur.


    Voici un fichier avec les caractéristiques particulières qui permettront de déterminer son emplacement final.

    Exemple : HYA_20080911_140000.tc (cf pièces jointes)

    HYA = nom
    2008 = année
    09 = mois
    tc = extension correspondant à un fichier de type temps comtinu (tc)

    Il y a deux extensions posibles : tc et bc qui correspondent à des dossiers de l’arborescence du serveur présenté ci-dessous.

    Voici l’arborescence du serveur. (cf pièces jointes)

    (cf : voir le pdf en pièce jointe pour un chéma en couleur)


    Comme vous pouvez le constater l’extension du fichier déterminera si l’on emprunte le chemin C:\SERVEUR1\billet\continu pour l’extension « *.bc » ou C:\SERVEUR1\temps\continu pour l’extension « *.tc »

    Ensuite il faudra « scanner » l’année, ici c’est 2008. Donc le chemin d’accès devient pour un fichier « *.bc » C:\SERVEUR1\billet\continu\2008.

    Le mois, ici 09, donc : C:\SERVEUR1\billet\continu\2008\9\

    Enfin le nom, ici HYA donc : C:\SERVEUR1\billet\continu\2008\9\Hyaguères

    Le fichier devra donc être copié à cet endroit.


    Mes connaissances : j’ai suivi des cours d’introduction au langage C.


    Mes idées pour le programme : Utiliser la fonction scanf pour lire le fichier et recopier dans un tableau les différents éléments du nom de fichiers dans le but de parcourir correctement l'arborescence du serveur selon l'élément trouver dans le talbeau.

    exemple : je créé le tableau suivant (la première ligne de ce tableau sert de repère, seule la deuxième ligne du tableau sera créer par le programme)

    1ère lettre extension --- 2ème lettre extension --- Année --- Mois --- Nom

    t c 2008 09 HYA

    Et le programme n'aura plus qu'a parcourir le tableau. Dès qu'il rencontrera l'indice 0 du tableau il devra se diriger dans l'arborescence du serveur jusqu'au dossier portant le nom "temps" pour t. Le tout avec la fonction if.

    if ( t[0] == "t" )
    go to C:\serveur\temps (par exemple)

    Le problème c'est que je n'ai aucune connaissance de la manipulation des dossiers en C, j'ai lu certain post, et il me semble que c'est assez compliqué ...


    Je voulais savoir si un programme en C était capable de résoudre mon problème, ou s’il fallait plutôt utiliser un logiciel.

    Merci d’avance pour votre aide.

    J'espère avoir été clair si vous avez des questions ou si vous voulez plus de détails j'y répondrai avec plaisir.

    Cordilament.

    Nicolas
    Images attachées Images attachées
    Fichiers attachés Fichiers attachés

  2. #2
    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 : 39
    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
    Tout d'abord, c'est pour quel système ? (Windows ? Linux ? etc.).

    Le problème c'est que je n'ai aucune connaissance de la manipulation des dossiers en C, j'ai lu certain post, et il me semble que c'est assez compliqué ...
    Sous Windows on a les fonctions CreateDirectory, RemoveDirectory, etc. Sous Linux et c'est mkdir, rmdir, etc.

    Je voulais savoir si un programme en C était capable de résoudre mon problème, ou s’il fallait plutôt utiliser un logiciel.
    Un logiciel écrit en C ... .

  3. #3
    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 pour cette réponse rapide.

    Le système c'est windows. Les fonctions CreateDirectory, RemoveDirectory ne me serviront pas puisque l'intérêt est de parcourir une arborescence existante dans le serveur pour y copier le fichier au bon endroit.

    Y a t'il des fonctions qui permettent de parcourir une arborescence ?

    Un logiciel écrit en C serait donc la solution ?

    Je n'ai appris qu'à créer des petits exécutables pour afficher des tableaux etc... Donc pour la création de logiciel en C je suis novice ...

    Ou pourrais je me renseigner pour avoir des infos ?

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Citation Envoyé par Hayden5127 Voir le message
    Merci pour cette réponse rapide.

    Le système c'est windows.
    Et c'est dommage car c'est typiquement le genre de problème qui serait résolu en quelques lignes de Shellscript sous Unix ou Linux. Si tu tiens absolument à rester sous Windows pour faire cela, tu peux le faire en C, certes, mais tu t'embêterais largement moins avec un peu de Perl.

    Vois déjà du côté des expressions régulières, qui te simplifieront largement la vie sur le long terme.

    Bon courage.

  5. #5
    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 : 39
    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
    Et c'est dommage car c'est typiquement le genre de problème qui serait résolu en quelques lignes de Shellscript sous Unix ou Linux.
    Et encore en moins de lignes en VBScript ou en batch . Mais bon, retour au C maintenant .

    Y a t'il des fonctions qui permettent de parcourir une arborescence ?
    Bien sûr : Comment lister le contenu d'un dossier ?
    Tu devras l'améliorer un peu pour parcourir aussi les sous répertoires. Un bon exercice de récursivité .

    Un logiciel écrit en C serait donc la solution ?
    Oui, un logiciel que tu écriras .

    Je n'ai appris qu'à créer des petits exécutables pour afficher des tableaux etc... Donc pour la création de logiciel en C je suis novice ...
    Bah, des petits exécutables c'est déjà des petits logiciels ! Que t'es novice, pas de problème. Tout s'apprend !

    Pour extraire les différentes infos contenues dans le nom des fichiers, sscanf, si tu sais bien l'utiliser, devrait suffir. Sinon, regarde aussi du côté de strtok.

  6. #6
    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 pour ces réponses !

    Je commence à bien "voir" la structure de mon programme.

    J'ai installé dev c++ sur mon ordi portable, et j'ai créé un projet. Je suis prêt à tenter pleins de petits programmes mais j'ai encore besoin de quelques précisions avant de vous soumettre des lignes de code...

    voici l'idée du programme :

    Les premières lignes du programmes utiliseront la fonction strtok pour extraire , si j'ai bien compris les explications, la chaine de caractère qui composent le nom du fichier.

    Une fois ces chaînes extraites, je copie dans un tableau les éléments dont j'ai besoin, je créé une boucle for qui me permettra grace à la fonction movefile et copyfile de déplacer automatiquement le fichier à copier dans le répertoire final grâce aux éléments du tableau !

    Le seul problème c'est que la clé usb contient elle aussi une arborescence qui doit être parcourue pour ensuite s"scanner" les noms de chaque fichier et le copier aux bon endroits ... Comment faire ? Sachant que l'arborescence de cette clé est connu et sera toujorus la même.

    Existe t'il une fonction qui permet de se diriger directement dans une arborescence précise pour copier les fichiers ?

    Exemple : l'arborescence de la clé usb est :

    Cle usb :\ temps \ continu \ "listing des fichiers"

    Mon idée serait de poser la question à l'utilsateur pour savoir s'il veut aller dans ce dossier ou un autre. et ensuite lancer la procédure de transfert automatique avec les idées ci dessus.

    Merci de vos réponse, je continue encore un peu la prise d'information et je vais bientôt me lancer dans la programmation même !

  7. #7
    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
    J'ai trouvé une astuce pour copier dans une variable appelée ici "tata" le nom du fichier en cours.
    J'ai crée un compteur appelé "toto" qui s'incrémente à chaque passage dans la boucle do ... while. J'ai crée une condition qui s'exécute que lorsque toto vaut 2. tout ça pour éviter les "." et ".."

    Le problème à l'avenir c'est que s'il m'affiche qu'un point au lieu de 2 points, je sauterai donc la copie du premier fichier ...

    J'ai essayé ta solution Melem avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (ent.cFileName DIFFERENT_DE "." ET ent.cFileName DIFFERENT_DE "..")
    {
        /* Faire le traitement. */
    }
    Ca ne marche pas, j'ai remplacé DIFFERENT_DE par != , ET par && , mais rien n'y fait il m'affiche toujours mes points.

    Ensuite beaucoup mais alors beaucoup plus embétant. Afin d'obtenir le nom du fichier en cours de listage j'ai ajouté "strcpy(nom_fichier_copie, ent.cFileName);" dans mon programme. Dans le but de recopier par la suite le nom du fichier en cours dans la varaible tata.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char nom_fichier_copie[5000][23], tata[23]; /* declaration */
     
    if ((hEnt = FindFirstFile("F:\\donnees\\goniometrie\\courts\\*.*", &ent)) != INVALID_HANDLE_VALUE)
                   { 
                             do
                             {
                             printf("%s\n", ent.cFileName);
                             strcpy(nom_fichier_copie, ent.cFileName);
                             strcpy(lpBuffer,ent.cFileName);
                             p = strtok(lpBuffer, separators);
                             i=0; /* etc etc */
    Tout marche niquel, tata vaut bien le dernier nom de fichier. Dès que je rajoute le le sprintf de souvrion, OU une fonction CopyFile, il m'affiche un beug au debuggage, et 3 fois sur 4 bizarement, et me dit sur cette ligne qu'il y a erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strcpy(nom_fichier_copie, ent.cFileName);
    avec le message suivant :
    passing arg1 of 'strcpy' from incompatible pointer type.

    Enfin j'aimerai juste que vous m'aidiez sur ce dernier point. J'aimerais savoir s'il existe la fonction inverse de la concatenation ou alors si on peut réinitialisé la variable chemin_source_9 à sa valeur de départ juste avant la concaténation ?? Car si c'est le cas mon programme fonctionne ! Vu que j'ai enfin le dernier nom de fichier en cours et le chemin source correct. Je les concatène et ca marche, le problème c'est la boucle, d'ou l'idée de réinitialisé ou de déconcaténer

    S'il existe un moyen, j'aimerai bien le connaitre.

    Merci encore pour tout.

  8. #8
    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 : 39
    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 ne marche pas, j'ai remplacé DIFFERENT_DE par != , ET par && , mais rien n'y fait il m'affiche toujours mes points.
    C'est bien la raison pour laquelle j'ai juste mis DIFFERENT_DE. Combien de fois faudra t-il te répéter qu'on compare des chaînes avec strcmp et non avec != ? Regarde dans les tutos pourquoi.

    passing arg1 of 'strcpy' from incompatible pointer type.
    nom_fichier_copie est un tableau de "tableaux de caractères", pas un tableau de caractères. nom_fichier_copie[0], nom_fichier_copie[1], etc. sont des tableaux de caractères. strcpy nécessite en premier argument l'adresse de début d'un tableau de caractères. Ce tableau doît être assez grand pour contenir la chaîne qui y sera copiée. On a déjà parlé de tout cela au moins 10 000 fois.

    Enfin j'aimerai juste que vous m'aidiez sur ce dernier point. J'aimerais savoir s'il existe la fonction inverse de la concatenation ou alors si on peut réinitialisé la variable chemin_source_9 à sa valeur de départ juste avant la concaténation ??
    Pour ça aussi on t'a déjà donné la solution. Oublie la concaténation et utilise un autre tableau pour copier tes noms de fichier. A ta place je mettrais carrément
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define CHEMIN_SOURCE_9 "F:\\donnees\\goniometrie\\courts\\"
    Pour que je ne serai pas tenté de copier ou concaténer quoi que soit là-dedans.

  9. #9
    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 mon programme fonctionne, j'ai fait des comparaisons de chaînes avec strcmp au lieu de != (honte à moi) et forcemment ça marche. Merci melem.

    J'ai déclaré un tableau de cractère et non un tableau de "tableau de cractères" et le message d'erreur strcpy a disparu.

    Pour la concaténation, melem tu seras pas d'accord mais j'ai trouvé une astuce qui fonctionne mais qui sera provisoire. Au début de mon test conditonnel if , lorsqu'il y a concatenation entre le chemin_destination_9 et le nom de fichier j'ai déclaré un tableau de caractère au nombre de [54] maximum vu que le chemin ne seras jamais aussi long (quoi que d'ou le problème ) ce qui fait que le tableau se restreint au dernier nom de fichier + chemin d'accès de la concaténation et ç'est tout bon !

    La meilleure solution serait de copier à la suite de cette chaine de caractère qui est fixe et d'une longueur 34 ! j'écrirai juste le nom de fichier à partir de chemin_destination_9 [35] et ce sera tout bon !

    Ceci dit il reste encore beaucoup d'amélioration dans ce programme. Notamment la création de l'arobrescence si celle ci n'existe pas. etc etc.

    Je vous tiendrai au courant de améliorations.

    Merci melem et merci souviron

  10. #10
    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
    Mon programme fonctionne, cependant j'aimerai l'améliorer.

    La condition pour enlever les "." et ".." du listage de dossier marche pas. j'ai tout essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if ((strcmp(ent.cFileName,".")==0) && (strcmp(ent.cFileName,"..")==0))
    {
    }
    else
    {
    /* traitement */
    }
    ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (!((strcmp(ent.cFileName,".")==0)) && (!(strcmp(ent.cFileName,"..")==0)))
    {
     
    /* Traitement */
     
    }
    Rien n'y fait. Ca marche quand même mais c'était histoire de trouver l'astuce.

  11. #11
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Ah !! La réflexion booléenne....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if ((strcmp(ent.cFileName,".")==0) || (strcmp(ent.cFileName,"..")==0))
    {
    }
    else
    {
    /* traitement */
    }

  12. #12
    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 : 39
    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
    Ou, comme je te l'ai montré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ((strcmp(ent.cFileName, ".") != 0) && (strcmp(ent.cFileName, "..") != 0))
    {
        /* traitement */
    }

+ Répondre à la discussion
Cette discussion est résolue.

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