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

WinDev Discussion :

Jauge pendant copie de fichier [WD17]


Sujet :

WinDev

  1. #1
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut Jauge pendant copie de fichier
    Bonjour à tous,

    j'ai lu plusieurs sujets sur la question mais aucun ne m'a vraiment apporté de solution.

    Quand mon appli de gpao nécessite d'être mise à jour, je publie le nouvel exécutable sur un partage réseau dans un sous-dossier qui porte le nom de la release, et je déclare cette release dans un paramètre général de ma base de données, pour annoncer aux clients quelle est la dernière release en date. Quand le client se connecte, il compare sa propre version à celle qui est déclarée sur le serveur, et si ce n'est pas la même alors je procède à l'importation du nouvel exécutable.

    Pour ce faire, je ferme mon appli gpao et je fais appel à un programme tiers (via LanceAppli juste avant la fermeture), que j'ai appelé updater.exe et qui n'a pas d'ihm, simplement il va se connecter au partage réseau et copier le nouvel exécutable en lieu et place de l'ancien.

    Actuellement j'utilise l'option frJauge de fCopieFichier pour afficher une jauge qui montre le transfert. Mon problème est que en local sur le même réseau la fenêtre de copie s'affiche assez vite, dans la seconde, et le transfert dure quelques secondes (un fichier de 6Mo à transférer), donc l'utilisateur comprend ce qu'il se passe et patiente. Par contre, lorsque je suis sur un site distant, en vpn par exemple, l'apparition de la fenêtre de transfert et de la jauge ne se fait pas avant une vingtaine de secondes (surement le temps de l'établissement de la connexion au partage réseau distant) et du coup il y a risque qu'un utilisateur pas très patient pense que le transfère est fini ou qu'il y a un problème, et relance mon client de gpao, et rebelote pour la mise à jour, l'attente sans comprendre ce qu'il se passe, etc....

    Du coup, j'ai décidé de mettre une toute petite fenêtre à mon programme updater.exe avec une jauge qui indique l'état de progression de la copie du fichier gpao.exe



    Ce que je ne sais pas faire, c'est récupérer l'état de la copie du fichier pendant le transfert. Est-ce qu'il y aurait une possibilité de sonder toutes les 500ms le nombre d'octets transférés, et donc d'en déduire un pourcentage du transfert ?

    Désolé pour la longue explication et au final une question relativement simple.

    Merci à vous
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 69
    Points : 128
    Points
    128
    Par défaut
    Bonjour,

    Je vous propose deux méthodes
    J'ai parfois utilisé la seconde

    1 - La fonction CopyFileExA de KERNEL32 permet d'utiliser une fonction callback pour gérer une jauge

    2 -Lire le fichier avec la fonction flit pour remplir un buffer de 512 octets par exemple, puis écrire avec fecrit et gérer une jauge d'avancement à chaque écriture.

    Cordialement

  3. #3
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Bonjour et merci

    je vais creuser la première piste

    je n'ai pas trop confiance en la seconde méthode, ça me semble "risqué" de copier un fichier morceaux par morceaux, enfin j'ai l'impression qu'on a plus de chances d'avoir à l'arrivée un fichier mal copié
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 327
    Points : 3 840
    Points
    3 840
    Par défaut
    Bonjour,

    Pourquoi ne pas réutiliser fCopieFichier(..) ?

    Oublie, j'ai déjà fait avec les octets, je retrouve la méthode...

  5. #5
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 327
    Points : 3 840
    Points
    3 840
    Par défaut
    Ca y est, trouvé !
    Il existe un superchamp 'Jauge Evoluée' qui a une méthode AffJauge(borneMin, borneMax). Il te suffit de passer en borneMax, la taille du fichier à copier.

  6. #6
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    il y a ce sujet que je n'avais pas trouvé dans mes premières recherches :

    http://www.developpez.net/forums/d12...r-copyfileexa/

    il fallait connaitre CopyFileExA

    je vais tenter d'implémenter cette méthode, j'espère qu'elle est fiable

    Pace que je ne voudrais pas compromettre une copie de fichier toute simple, juste pour afficher une jauge à l'utilisateur

    Si la copie par CopyFileExA marche 3 fois sur 4, j'aime autant rester avec mon fCopieFichier et une simulation de jauge infinie pour patienter !
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  7. #7
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Bonjour à tous

    aujourd'hui dans la mise à jour de mon appli il y a 2 fichiers à copier.... hé bien la copie plante

    Ci dessous le code de copie :

    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
    ResListeFichier = fListeFichier(partage_reseau+"\release\"+release+"\*.*", frNonRécursif + frInterruptible)
    // Pour chaque fichier trouvé
    POUR TOUTE CHAÎNE UnFichier DE ResListeFichier SEPAREE PAR RC
     
    	SI fExtraitChemin(UnFichier,fFichier) <> "Thumbs" ALORS
     
    		ResCopie = fCopieFic(partage_reseau+"\release\"+release+"\" + fExtraitChemin(UnFichier,fFichier) + fExtraitChemin(UnFichier,fExtension), fRepExe() + "\" + fExtraitChemin(UnFichier,fFichier) + fExtraitChemin(UnFichier,fExtension))
     
    		// Affichage du message d'erreur si la copie n'a pas été effectuée
    		SI ResCopie = Faux ALORS
    			Erreur(ErreurInfo(errMessage))
    			FinProgramme()
    			RETOUR
    		FIN
     
    	FIN
    FIN
    la procédure fCopieFic qui est inchangée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    FONCTION fCopieFic(sSource est une chaîne,sDest est une chaîne)
    sLocSource             est une chaîne=sSource
    sLocDest             est une chaîne=sDest
    bRetourApi             est un booléen
    nExistingFileName     est un entier=&sLocSource //Ici l'adresse de la chaîne, pourrait être la chaîne en direct
    nNewFileName         est un entier=&sLocDest //Ici l'adresse de la chaine, pourrait être la chaîne en direct
    nData                 est un entier
    nCancel             est un entier
    nCopyFlags            est un entier
    bRetourApi=API("KERNEL32","CopyFileExA",nExistingFileName,nNewFileName,&fCopyProgressRoutine,nData,nCancel,nCopyFlags)
    RENVOYER bRetourApi
    et ma procédure fCopyProgressRoutine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FONCTION fCopyProgressRoutine(nTotalFileSize est un entier sur 8 octets, nTotalBytesTransferred est un entier sur 8 octets, nStreamSize est un entier sur 8 octets, nStreamBytesTransferred est un entier sur 8 octets,nStreamNumber est un entier sans signe sur 4 octets,nCallbackReason est un entier sans signe sur 4 octets, nHSourceFile est un entier, nHDestinationFile est un entier)
     
    taux est un numérique = (nTotalBytesTransferred / nTotalFileSize) * 100
     
    JAUGE_Jauge = taux
    C'est dans cette dernière que l'exécution se fige, le premier fichier est pris en considération, le process transfère 754 Ko sur 771, me positionne la jauge à 96,6% et ensuite ça bloque. Non seulement il ne termine pas le transfert du premier fichier, mais il ne passe pas au second. J'ai fait d'autres essais, avec des petits fichiers texte. J'ai l'impression que ça le fait plus systématiquement quand il s'agit de tout petits fichiers...

    Et bien sur ça fait ça sur tous les postes.

    Du coup j'ai enlevé un des 2 fichiers et je fais la mise à jour en 2 étapes, 1 fichier à la fois.....

    Merci pour toute éventuelle piste, là je sèche
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  8. #8
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 69
    Points : 128
    Points
    128
    Par défaut
    Bonjour,

    A tout hasard ce ne serait pas un anti virus qui bloque et analyse la copie ?

  9. #9
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    bonne idée, mais je viens de retester en fermant Kaspersky et malwarebytes, et ça ne change rien

    vraiment étrange
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  10. #10
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Je viens de tester en mettant dans mon dépôt de mise à jour 3 fichiers d'au moins 2-3Mo chacun, hé bien le process de copie se déroule sans problème, les 3 fichiers sont rapatriés.

    Par contre, dès que je mets dans le lot un petit fichier de même pas 1Ko (un fichier texte avec du blabla dedans) alors ça plante.

    Concrètement, si j'ai 2 fichiers (un gros et un petit) le gros qui s'appelle aaaaaa.pdf (qui pèse 3Mo et se trouve en premier dans la liste), et le petit que j'ai volontairement appelé zzzzz.txt (pèse 781 octets et se trouve en dernier dans la liste) alors le plantage intervient au moment de la copie du second fichier, le petit. Et si j'inverse les noms, le plantage a lieu pendant la copie du premier fichier, toujours le petit fichier.

    Voilà à peu près tout ce que je peux apporter comme indices.

    Bonne journée en attendant
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  11. #11
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Bonjour à tous,

    en attendant peut-être une correction au niveau de mon utilisation de l'api CopyFileExA, je contourne un peu le bug en repartant sur l'emploi de la fonction fCopieFichier, qui même si elle ne permet pas de spécifier une fonction de callback pour mettre à jour une jauge, elle a au moins le mérite d'être stable, quel que soit le nombre de fichiers à copier, et quelle que soit leur taille.

    Ainsi, je me base sur la taille de chacun de fichiers copiés pour faire évoluer la jauge, après chaque copie (donc pas en temps réel), laquelle jauge est initialisée avant la copie avec sa borne max égale à la taille du répertoire contenant les N fichiers à copier (en octets).
    Enfin, pour ne pas figer l'ihm, je fais avancer la jauge par accoups de 1000 octets.
    Je voulais instaurer une micro pause entre chaque avancement de jauge, mais l'espace temps minimum de 1 centième de secondes est encore trop long car a l'exécution ça ressemble plus à une seconde et demi entre chaque pas.

    Quoi qu'il en soit, voici mon code actuel, ma jauge évolue en fonction du volume copié (avec un décalage par rapport à la copie certes), mais ça fonctionne, ça prend 15 fichiers s'il faut, et ça ne plante plus.


    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
    UnFichier, ResListeFichier sont des chaînes
    ResCopie est un booléen
     
    ResListeFichier = fListeFichier(partage_reseau+"\release\"+release+"\*.*", frNonRécursif+frSansFichierCaché)
     
    //NbFic est un entier = ChaîneOccurrence(ResListeFichier,RC) +1 
     
    maxi est un entier
    maxi_jauge est un entier = fRepTaille(partage_reseau+"\release\"+release)
    JAUGE_Jauge..BorneMax = maxi_jauge
     
     
    POUR TOUTE CHAÎNE UnFichier DE ResListeFichier SEPAREE PAR RC
     
    	SI fExtraitChemin(UnFichier,fFichier) <> "Thumbs" ALORS
     
    		ResCopie = fCopieFichier(partage_reseau+"\release\"+release+"\" + fExtraitChemin(UnFichier,fFichier) + fExtraitChemin(UnFichier,fExtension), fRepExe(),frJauge)
     
    		// Affichage du message d'erreur si la copie n'a pas été effectuée
    		SI ResCopie = Faux ALORS
    			Erreur(ErreurInfo(errMessage))
    			FinProgramme()
    			RETOUR
    		FIN
     
    		maxi = fTaille(UnFichier) / 1000
     
    		POUR i = 1 _A_ maxi
    			JAUGE_Jauge += 1000
    		FIN
     
    		ThreadPause(20)
     
    	FIN
    FIN
     
    JAUGE_Jauge = maxi_jauge
    A la fin j'affecte quand même la jauge à sa borne max pour que ça fasse bien 100, car en divisant la taille de chaque fichier par 1000 on perds quelques octets en route, seulement dans le calcul !

    Je vais publier cette version sur mon serveur ce soir, en attendant si vous avez des idées d'améliorations, je suis toujours preneur !


    Merci
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

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

Discussions similaires

  1. Copie de fichier sur le bureau
    Par LoicH dans le forum C++Builder
    Réponses: 3
    Dernier message: 01/05/2005, 20h57
  2. [C#] Copie de fichier via l'API
    Par slyv dans le forum Windows Forms
    Réponses: 5
    Dernier message: 20/12/2004, 22h39
  3. [C#] Copie de fichier via l'API
    Par slyv dans le forum Windows
    Réponses: 5
    Dernier message: 20/12/2004, 22h35
  4. [Kylix] Copie de fichier...
    Par paty.olivier dans le forum EDI
    Réponses: 1
    Dernier message: 23/06/2004, 12h55
  5. Copie de fichier
    Par Bjorn dans le forum C
    Réponses: 4
    Dernier message: 11/06/2002, 15h23

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