PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Jauge Progression CECOPIEFICHIER
Jauge Progression CECOPIEFICHIER
Débuté par Thierry GEANNIN, 19 fév. 2019 14:17 - 4 réponses
Posté le 19 février 2019 - 14:17
Bonjour

tout est dans le titre, je dois copier des fichiers vers un pda et je souhaiterais avoir une jauge dans ma fenêtre qui permette de suivre la progression.

j'ai testé la procédure gestionprogression mais rien ne se passe.

auriez vous une idée

merci
Membre enregistré
1 936 messages
Popularité : +53 (65 votes)
Posté le 20 février 2019 - 09:22
Bonjour,
// Copie les fichiers présents dans le répertoire "\MesImages" sur le Terminal Mobile (Pocket PC) connecté vers le poste en cours
// Les sous-répertoires et leurs fichiers sont pris en compte (constante ceRécursif)
ResCopie = ceCopieFichier(cePocketVersPC + ceRécursif, ...
"\MesImages\*.*", "C:\MesFichiers\", GestionProgression)

// -- Code de la procédure GestionProgression
Procedure GestionProgression(TotalOctet, TotalTransmis)
// Affiche la progression de la copie dans la barre de message
Message("Copie en cours : " + TotalTransmis + " / " + TotalOctet)
RENVOYER Vrai

Avez-vous bien défini une barre de messages dans votre fenêtre ??

--
Bon dev,
Jean-Pierre
Membre enregistré
23 messages
Posté le 28 mai 2019 - 19:19
Bonjour,
moi je dois copier des fichiers de pc a serveur (ou l'inverse). Parfois ils sont tres gros, mais avec la fonction fcopiefichier si j'utilise la fonction <Résultat> = fCopieFichier(<Fichier source> , <Fichier ou répertoire destination> [, <Indicateur de copie>]) avec frjauge c'est la jauge windows.

Or je voudrais utiliser une jauge personnalisee, donc j'essaie d'utiliser la fonction <Résultat> = fCopieFichier(<Fichier source> , <Fichier ou répertoire destination> , <Nom de la procédure> [, <Pointeur> [, <Indicateur de copie>]])
et dans la procedure appelee j'ai bien le nom du fichier source et cible, mais pas la progression en octets

qui peut m'aider? je ne trouve rien sur le forum a ce propos pour copie de pc a pc

--
MAP
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 28 mai 2019 - 20:52
Bonjour,
Il y a peut être plus simple avec la version 24. En V20 je ferais ainsi
ResAPI est un boolean
hndDll est un entier
DllName, ExistingFileName, NewFileName est une chaîne

DllName = "Kernel32.dll"
ExistingFileName = "D:\Temp\cosmologie_03.m4v"
NewFileName = "E:\cosmologie_03.m4v"

hndDll = ChargeDLL(DllName)
IF hndDll = 0 THEN
Erreur(ChaîneConstruit("Chargement de %1 impossible !", DllName))
RETOUR
END

IF fFichierExiste(NewFileName) THEN fSupprime(NewFileName)


ResAPI = API(DllName, "CopyFileExA", &ExistingFileName, &NewFileName, &progressRoutine, Null, False, 0)
IF NOT ResAPI THEN
Erreur("Echec de la copie...")
ELSE
Info("Fichier copié.")
END

DéchargeDLL(hndDll)


et le code de la procédure pour affichr votre jauge
Procedure progressRoutine(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred, dwStreamNumber, dwCallbackReason, hSourceFile, hDestinationFile, lpData)
Trace(StreamSize, TAB, TotalFileSize, TAB, NumériqueVersChaîne((StreamSize*100)/TotalFileSize, "6.2f"))
Message modifié, 28 mai 2019 - 21:09
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 30 mai 2019 - 19:17
Bonjour,
j'avais un peu de temps libre alors voici un peu plus étoffé avec plus de contrôles une méthode possible :

// Exemple d'appel avec un champ jauge qui existe (si il n'existe pas le programme copie quand même)
CopyFileEX("D:\Temp\cosmologie_03.m4v", "E:\cosmologie_03.m4v", MaJauge..NomComplet)


La fonction globale (reste à remplacer les RETOUR par des RENVOYER errCode)
Procedure CopyFileEX(ExistingFileName est une chaîne, NewFileName est une chaîne, pJaugeName est une chaîne = "")

//https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/224118-jauge-progression-cecopiefichier-230476/read.awp
ResAPI est un boolean
DiskFree, hndDll est un entier
lpData est un entier sur 4 octets
DllName, TargetDisk est une chaîne
JaugeName est une chaîne ASCIIZ sur 512 = pJaugeName

DllName = "Kernel32.dll"


// Vérifier si le fichier source existe
IF NOT fFichierExiste(ExistingFileName) THEN
Erreur(ChaîneConstruit("Le fichier : %1, n'existe pas !",ExistingFileName))
RETOUR
END

// et qu'il contient quelque chose.
IF fTaille(ExistingFileName) = 0 THEN
Info(ChaîneConstruit("Le fichier : %1 est vide !", ExistingFileName))
RETOUR
END

// Vérifier si le disque cible existe
TargetDisk = fExtraitChemin(NewFileName, fDisque)

IF NOT fDisquePrêt(TargetDisk) THEN
Erreur(ChaîneConstruit("Disque : %1, invalide !", TargetDisk))
RETOUR
END

// Calcule l'espace libre sur le disque cible pour le comparer à la taille du fichier à copier
DiskFree = fDisqueInfo(TargetDisk, fdEspaceLibre)
IF fFichierExiste(NewFileName) THEN DiskFree += fTaille(ExistingFileName) // on va effacer la cible cela va liberer de la place

//Vérifier si la place libre est suffisante
IF fTaille(ExistingFileName) > DiskFree THEN
Erreur(ChaîneConstruit("Place insuffisante sur le lecteur : %1 !", TargetDisk))
RETOUR
END

// Si le fichier existe déjà on demande si on doit le remplacer par le nouveau fichier
IF fFichierExiste(NewFileName) THEN
IF OuiNon(Non, ChaîneConstruit("Le fichier : %1 existe déjà. Voulez-vous le remplacer par : %2", NewFileName, ExistingFileName)) = Oui THEN
IF NOT fSupprime(NewFileName) THEN
Erreur(ChaîneConstruit("Impossible de supprimer le fichier : %1", NewFileName))
RETOUR
END
ELSE
RETOUR
END
END

// Chargement de la dll
hndDll = ChargeDLL(DllName)
IF hndDll = 0 THEN
Erreur(ChaîneConstruit("Chargement de %1 impossible !", DllName))
RETOUR
END

// Pour la jauge
IF ChampExiste(JaugeName) _AND_ {JaugeName, indChamp}..Type = typJauge THEN
{JaugeName, indChamp}..BorneMax = fTaille(ExistingFileName)
{JaugeName, indChamp}..Visible = True
lpData = &JaugeName
ELSE
lpData = Null
END

// Go
// see : https://docs.microsoft.com/fr-fr/windows/desktop/api/winbase/nf-winbase-copyfileexa
Sablier(True)
ResAPI = API(DllName, "CopyFileExA", &ExistingFileName, &NewFileName, &progressRoutine, &JaugeName, False, 0)

IF ChampExiste(JaugeName) _AND_ {JaugeName, indChamp}..Type = typJauge THEN {JaugeName}..Visible = False
Sablier(False)
IF NOT ResAPI THEN Erreur("Echec de la copie...") ELSE Info("Fichier copié.")

DéchargeDLL(hndDll)



et la procédure globale appelée pour mettre à jour la jauge :
// see : https://docs.microsoft.com/fr-fr/windows/desktop/api/winbase/nc-winbase-lpprogress_routine
Procedure progressRoutine(TotalFileSize est un entier sur 8 octets, TotalBytesTransferred est un entier sur 8 octets,...
StreamSize est un entier sur 8 octets, StreamBytesTransferred est un entier sur 8 octets,...
StreamNumber est un entier sur 4 octets, CallbackReason est un entier sur 4 octets,...
hSourceFile est un entier sur 4 octets, hDestinationFile est un entier sur 4 octets,...
lpData est un entier sur 4 octets)

JaugeName est une chaîne = ""

IF lpData <> Null THEN
WHEN EXCEPTION IN
JaugeName = ChaîneRécupère(lpData, crAdresseASCIIZ)
IF ChampExiste(JaugeName) _AND_ {JaugeName, indChamp}..Type = typJauge THEN
{JaugeName, indChamp}..Valeur = TotalBytesTransferred
END
DO

END
END

IF ToucheEnfoncée(teEchap, False) THEN
IF OuiNon(Non, "Arrêt de la copie ?") = Oui THEN RENVOYER PROGRESS_CANCEL ELSE RENVOYER PROGRESS_CONTINUE
END

RENVOYER PROGRESS_CONTINUE


Constantes :
PROGRESS_CONTINUE = 0
PROGRESS_CANCEL = 1
Message modifié, 30 mai 2019 - 19:18