Exemple de fonction récursive de type BFF (Browse For Folder)
Je me suis essayé à la récursivité dans WinDev avec succès.

Voici un exemple permettant de trouver tous les répertoires fils d'un répertoire père.
(utilisation directe de l'API bas niveau)

tabDirname est tableau dynamique de 0 string
sPath is string = "C:\mes projets\"
Bff_ReadDirs(sPath, tabDirname)


PROCEDURE Bff_ReadDirs(sPath is string, tabDirname)
FILETIME is structure
   dwLowDateTime  is int
   dwHighDateTime is int
END

WIN32_FIND_DATA is structure
   dwFileAttributes   is int
   ftCreationTime     is FILETIME
   ftLastAccessTime   is FILETIME
   ftLastWriteTime    is FILETIME
   nFileSizeHigh      is int
   nFileSizeLow       is int
   dwReserved0        is int
   dwReserved1        is int
   cFileName          is string fixed on 260
   cAlternateFileName is string fixed on 14
END
fd is WIN32_FIND_DATA

P, N is int
szPath is string ASCIIZ on 260 = sPath + "*"
hFind is int = API("KERNEL32", "FindFirstFileA", &szPath, &fd)
IF hFind <> -1 THEN
   LOOP
      IF BinaryAND(fd:dwFileAttributes, 16) THEN //Répertoire uniquement (16)
         IF Asc(fd:cFileName) <> 46 THEN         //Ni . ni ..
            N = Max(ArrayInfo(tabDirname, tiDimension) + 1, 1)
            Dimension(tabDirname, N)
            P = Max(Position(fd:cFileName, Charact(0)) - 1, 0)
            //On a trouvé un répertoire, on le mémorise
            tabDirname[N] = sPath + Left(fd:cFileName, P) + "\"
            Trace(N, tabDirname[N])
            //On appel à nouveau la fonction pour trouver les autres
            //Chaque appel récursif trouve sa place sur la pile (stack)
            Bff_ReadDirs((tabDirname[N]), tabDirname)	
         END 
      END
   TO DO WHILE API("KERNEL32","FindNextFileA", hFind, &fd)
   API("KERNEL32", "FindClose", hFind)
END


Auteur Patrice Terrier
Tel 04.76.98.16.73
pterrier@zapsolution.com
www.zapsolution.com

Contribution le : 18/06/2006 17:24
Créer un fichier PDF de la contribution Imprimer


Re: Exemple de fonction récursive de type BFF (Browse For Folder)
ChefDeProjet WDF
Inscrit:
02/05/2006 21:28
Post(s): 160
bien que j'apprécie tes contributions

flistefichier() fait ça aussi

Contribution le : 18/06/2006 22:19
Créer un fichier PDF de la contribution Imprimer


Re: Exemple de fonction récursive de type BFF (Browse For Folder)
La procédure WinDev correspondante se nomme :
fListeRépertoire.

Bff_ReadDirs est intéressant car il permet de vérifier l'aptitude de WinDev a exécuter des procédures récursives et montre l'utilisation de l'API bas niveau qui fait tout le travail. Accessoirement j'ai pu également vérifier que WinDev est capable de faire un REDIM PRESERVE d'un tableau dynamique (même si c'est à éviter car cela ralenti le traitement).

Contribution le : 18/06/2006 23:53
Créer un fichier PDF de la contribution Imprimer


Re: Exemple de fonction récursive de type BFF (Browse For Folder)
Animateur WDF
Inscrit:
19/01/2004 13:48
De www.sigmasys.fr
Post(s): 988
Bonjour,

J'ai réalisé une procédure similaire permettant de lister tous les fichiers d'un répertoire via les API et renvoyer la liste des fichiers présent dans le répertoire sous forme de chaine.

Ce qui est intéressant c'est que cela permet d'effectuer un traitement sur les fichiers avec une jauge (on a déjà compté le nombre de fichiers au total pendant l'exécution de la procédure). On récupère le chemin des fichiers avec un extraitchaine sur le résultat de la fonction.
En passant par les apis on peut facilement lancer le listing d'un répertoire dans un thread, pratique :).

Bon dév.,

Totof

Contribution le : 19/06/2006 00:03
_________________
[ Totof(Christophe LOGEL) réalise des développements spécifiques WinDev (Mon annonce wdforge), http://www.sigmasys.fr]
Créer un fichier PDF de la contribution Imprimer


Re: Exemple de fonction récursive de type BFF (Browse For Folder)
Animateur WDF
Inscrit:
26/06/2002 16:24
De wdforge.org
Post(s): 2822
Bien.
Cette ressource existe depuis... pas mal de temps. En effet la récursivité ne pose aucun problème en WinDev.

Entre fListeFichier et fListeRépertoire, fRep() est aussi utilisable et se programme sans callback.

Bref, bien des solutions pour lire une arborescence... Qui fait un comparatif de performance ?

Contribution le : 19/06/2006 07:27
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer


Re: Exemple de fonction récursive de type BFF (Browse For Folder)
Je compte ajouter cette fonction dans la DLL gratuite zBff ce qui permettra de booster la vitesse par rapport au code posté ci-dessus.

A noter que la fonction WinDev FListeRépertoire est rapide car elle est écrite directement en C et n'alloue pas dynamiquement un tableau.

J'espère que WinDev aura un jour la possibilité de générer directement du code source C (comme pour JAVA) afin qu'on puisse créer du vrai code compilé.

Contribution le : 19/06/2006 08:36
Créer un fichier PDF de la contribution Imprimer


Re: Exemple de fonction récursive de type BFF (Browse For Folder)
Je viens de faire un comparatif avec une DLL 32-bit qui utilise une callback comme dans fListeRépertoire et le résultat est sensiblement le même.

Contribution le : 19/06/2006 17:53
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
CompteNom   Mot de passe   Authentification
Message:


Vous ne pouvez pas débuter de nouveaux sujets.
Vous pouvez voir les sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2