Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 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 | | Calendrier |
|
|
| Arborescence des dossiers | |
| | Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Arborescence des dossiers Mer 31 Oct 2012 - 10:33 | |
| Voici un nouvel essai de lister l'arborescence des dossiers, à partir du répertoire par défaut. Il y a un commentaire dans le programme pour marquer l'endroit où on peut forcer un autre dossier de départ. Le programme charge une liste avec l'arborescence des dossiers. On peut ensuite parcourir cette liste pour traiter les fichiers de chaque dossier. Le problème venait du fait que la vraie récursivité des procédures n'est pas acquise. J'ai donc pallié à ce problème avec des boucles WHILE imbriquées. - Code:
-
' analyser_sources.bas
labels() variables() form0() GUI() initialisations()
end
start: clear no_l1% s$ = dir_current$ save$ = s$ ' dir_change ... : ' <======== forcer ici éventuellement un autre dossier de départ if s$="_" then return indent$ = " " item_add no_l1%,indent$ + s$ analyser_dossiers() traiter_fichiers() dir_change save$ return
sub labels() label start end_sub
sub variables() dim no%, i%, s$, indent$, save$ dim no_l1% end_sub
sub form0() full_space 0 caption 0,"Analyser les fichier sources" end_sub
sub GUI() no% = no% + 1 : button no% : top no%,10 : left no%,10 caption no%,"Start" : on_click no%,start no% = no% + 1 : list no% : no_l1% = no% top no%,40 : left no%,10 : width no%,600 : height no%,600 end_sub
sub initialisations() indent$ = "" end_sub
sub analyser_dossiers() dim_local n%, i%, p%, flag% indent$ = indent$ + " " flag% = 1 while flag%=1 n% = 1 flag% = 0 while n%<=count(no_l1%) s$ = item_read$(no_l1%,n%) if left$(s$,2)=" " item_delete no_l1%,n% item_insert no_l1%,n%,"--"+mid$(s$,3,len(s$)) p% = 0 for i%=1 to len(s$) if mid$(s$,i%,1)<>" " then exit_for p% = i% next i% indent$ = string$(p%+2," ") s$ = trim$(s$) dir_change s$ s$ = file_find_first$ while s$<>"_" if dir_exists(s$)=1 n% = n% + 1 ' item_insert no_l1%, n%, indent$ +s$ : ' <== sans le chemin complet item_insert no_l1%, n%, indent$ + dir_current$+"\"+s$ : ' avec le chemin complet flag% = 1 end_if s$ = file_find_next$ end_while file_find_close end_if n% = n% + 1 end_while end_while item_add no_l1%,"*** terminé ***" end_sub
sub traiter_fichiers()
end_sub
EDIT J'ai inséré chaque fois le chemin complet, pour pouvoir traiter la liste plus facilement après. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Arborescence des dossiers Mer 31 Oct 2012 - 10:55 | |
| Et une application de ce principe pour trouver tous les fichiers BAS dans une arborescence. La procédure lister_fichiers accepte une extension en paramètre. Si cette extension est la chaîne vide "", elle liste tous les fichiers, mais sans les répertoires. - Code:
-
' analyser_sources.bas
labels() variables() form0() GUI() initialisations()
end
start: clear no_l1% clear no_l2% s$ = dir_current$ save$ = s$ ' dir_change ... : ' <======== forcer ici éventuellement un autre dossier de départ if s$="_" then return indent$ = " " item_add no_l1%,indent$ + s$ analyser_dossiers() lister_fichiers(".bas") dir_change save$ return
sub labels() label start end_sub
sub variables() dim no%, i%, s$, indent$, save$ dim no_l1%, no_l2% end_sub
sub form0() caption 0,"Analyser les fichier sources" end_sub
sub GUI() no% = no% + 1 : button no% : top no%,10 : left no%,10 caption no%,"Start" : on_click no%,start
no% = no% + 1 : memo no% : no_l1% = no% : bar_both no% top no%,40 : left no%,10 : width no%,200 : height no%,400 no% = no% + 1 : memo no% : no_l2% = no% : bar_both no% top no%,40 : left no%,220 : width no%,200 : height no%,400
end_sub
sub initialisations() indent$ = "" end_sub
sub analyser_dossiers() dim_local n%, i%, p%, flag% indent$ = indent$ + " " flag% = 1 while flag%=1 n% = 1 flag% = 0 while n%<=count(no_l1%) s$ = item_read$(no_l1%,n%) if left$(s$,2)=" " item_delete no_l1%,n% item_insert no_l1%,n%,"--"+mid$(s$,3,len(s$)) p% = 0 for i%=1 to len(s$) if mid$(s$,i%,1)<>" " then exit_for p% = i% next i% indent$ = string$(p%+2," ") s$ = trim$(s$) dir_change s$ s$ = file_find_first$ while s$<>"_" if dir_exists(s$)=1 n% = n% + 1 item_insert no_l1%, n%, indent$ + dir_current$+"\"+s$ flag% = 1 end_if s$ = file_find_next$ end_while file_find_close end_if n% = n% + 1 end_while end_while item_add no_l1%,"*** terminé ***" end_sub
sub lister_fichiers(ext$) dim_local n%, s$ if count(no_l1%)=0 then return for n%=1 to count(no_l1%) s$ = item_read$(no_l1%,n%) s$ = trim$(mid$(s$,3,len(s$))) dir_change s$ s$ = file_find_first$ while s$<>"_" if dir_exists(s$)=0 if ext$<>"" if right$(s$,len(ext$))=ext$ then item_add no_l2%,dir_current$+"\"+s$ else item_add no_l2%,dir_current$+"\"+s$ end_if end_if s$ = file_find_next$ end_while file_find_close next n% end_sub
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Arborescence des dossiers Mer 31 Oct 2012 - 16:30 | |
| Salut Klaus Dans SUB lister_fichiers(ext$), ligne 93 - Code:
-
if count(no_l1%)=0 then return
Tu veux sans doute dire - Code:
-
if count(no_l1%)=0 then EXIT_SUB
Le système n’a pas détecté l’erreur ‘RETURN without gosub’ parce que la condition count(no_l1%) = 0 n’est pas réalisée. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 31 Oct 2012 - 18:16 | |
| Je viens mettre mon grain de sel... Depuis les "exit_Sub", le "Return" de la façon dont il est utilisé là par Klaus devrait renvoyer un message d'erreur du type : "Return with out gosub". Non ? | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Arborescence des dossiers Mer 31 Oct 2012 - 19:37 | |
| Faut pas oublier que c'est une version temporaire et non pas officielle que vous utilisez... Je pense qu'en ce moment Jack doit "blinder" la chose et prévoir tous les messages d'erreurs qui va avec... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 31 Oct 2012 - 20:13 | |
| Certes elle était mal formulé, mais c' était une question en l'air... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Arborescence des dossiers Mer 31 Oct 2012 - 21:28 | |
| Salut tout le monde Si le système ne détecte pas l’erreur ‘RETURN without GOSUB’ c’est parce que la condition n’est pas réalisée. En effet, pour le système si la condition est fausse, il n’ira pas évaluer ce qui est après THEN abstraction faite que ce soit dans une procédure SUB ou dans n’importe quel endroit du programme. - Code:
-
dim i% i% = 10 test() end sub test() print "i% = ";i% print "blablabla" if i% <> 10 then return print "i% n'est pas <> 10 donc j'y reste" print "i% = 10 donc erreur RETURN without GOSUB" ' if i% = 10 then return if i% = 10 then exit_sub print "suite" end_sub
Vous pouvez écrire n’importe quelle absurdité après THEN et le système ne bronche pas tant que la condition avant THEN reste fausse - Code:
-
dim i% i% = 5 if i% = 1 then then et encore then et tout ce que vous voulez terminate ou salut print "je suis ici"
Est-ce qu'on apprécie ça ou non ? ça se discute! | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Arborescence des dossiers Mer 31 Oct 2012 - 21:46 | |
| Merci Klaus, très bon exercice de manipulation de fichiers / répertoires et de boucles. Tu pourrais en faire un tuto intéressant, je pense. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Arborescence des dossiers Mer 31 Oct 2012 - 22:09 | |
| Suite à la correction du même problème dans un autre post, dans ma demande d'aide, je poste ici le code corrigé. 2videmment, le RETURN doit être remplacé par un EXIT_SUB. Voici le code corrigé: - Code:
-
' analyser_sources.bas
labels() variables() form0() GUI() initialisations()
end
start: clear no_l1% clear no_l2% s$ = dir_current$ save$ = s$ ' dir_change ... : ' <======== forcer ici éventuellement un autre dossier de départ if s$="_" then return indent$ = " " item_add no_l1%,indent$ + s$ analyser_dossiers() lister_fichiers(".bas") dir_change save$ return
sub labels() label start end_sub
sub variables() dim no%, i%, s$, indent$, save$ dim no_l1%, no_l2% end_sub
sub form0() caption 0,"Analyser les fichier sources" end_sub
sub GUI() no% = no% + 1 : button no% : top no%,10 : left no%,10 caption no%,"Start" : on_click no%,start
no% = no% + 1 : memo no% : no_l1% = no% : bar_both no% top no%,40 : left no%,10 : width no%,200 : height no%,400 no% = no% + 1 : memo no% : no_l2% = no% : bar_both no% top no%,40 : left no%,220 : width no%,200 : height no%,400
end_sub
sub initialisations() indent$ = "" end_sub
sub analyser_dossiers() dim_local n%, i%, p%, flag% indent$ = indent$ + " " flag% = 1 while flag%=1 n% = 1 flag% = 0 while n%<=count(no_l1%) s$ = item_read$(no_l1%,n%) if left$(s$,2)=" " item_delete no_l1%,n% item_insert no_l1%,n%,"--"+mid$(s$,3,len(s$)) p% = 0 for i%=1 to len(s$) if mid$(s$,i%,1)<>" " then exit_for p% = i% next i% indent$ = string$(p%+2," ") s$ = trim$(s$) dir_change s$ s$ = file_find_first$ while s$<>"_" if dir_exists(s$)=1 n% = n% + 1 item_insert no_l1%, n%, indent$ + dir_current$+"\"+s$ flag% = 1 end_if s$ = file_find_next$ end_while file_find_close end_if n% = n% + 1 end_while end_while item_add no_l1%,"*** terminé ***" end_sub
sub lister_fichiers(ext$) dim_local n%, s$ if count(no_l1%)=0 then exit_sub for n%=1 to count(no_l1%) s$ = item_read$(no_l1%,n%) s$ = trim$(mid$(s$,3,len(s$))) dir_change s$ s$ = file_find_first$ while s$<>"_" if dir_exists(s$)=0 if ext$<>"" if right$(s$,len(ext$))=ext$ then item_add no_l2%,dir_current$+"\"+s$ else item_add no_l2%,dir_current$+"\"+s$ end_if end_if s$ = file_find_next$ end_while file_find_close next n% end_sub
| |
| | | Invité Invité
| Sujet: Re: Arborescence des dossiers Jeu 1 Nov 2012 - 1:17 | |
| Je viens de faire une analyse complète de ton programme, et j'ai rien à lui reprocher. J'ai pas trouvé de problème de structure comme j'ai pu l'avoir avec Pagiciel. L'incrémentation et la décrémentation des sub et procédure sont bonnes. C'est bien un problème de lecture de fichier qui se pose à un moment donné, et sans raison apparente. C'est bien lié à Panoramic, car si je mets: - Code:
-
execute "notepad "+f$ file_open_read 1,f$ Le fichier est ouvert sans problème dans le bloc Note, mais il y a blocage avec : - Code:
-
file_open_read 1,f$ |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Arborescence des dossiers Jeu 1 Nov 2012 - 1:29 | |
| Merci de ton analyse. Il est rassurant de voir que tu valides mon code.
Dans ton exemple, à la limite, on pourrait supposer que Notepad "verrouille" le fichier, et que de ce fait, il devient inaccessible pour Panoramic.
Cela n'est pas le cas dans mon programme. Mes boucles de recherche parcourent l'arborescence des dossiers et placent une liste de noms de fichiers avec leur chemin d'accès, dans une liste. Aucun de ces fichiers n'a encore été ouvert. Et dès que j'essaie d'ouvrir le premier de ces fichiers (ou n'importe lequel d'entre eux, par exemple), il y a erreur.
Et c'est même pire. Après l'exécution du bouton 1, j'ai créé, avec Notepad, un fichier essai.txt placé dans un des répertoires. Et au début du traitement du bouton 2, je fais explicitement file_open_read 1,f$ avec f$ contenant le chemin complet et le nom essai.txt. Même erreur, alors que ce fichier n'a même pas été vu par la boucle de recherche, pour la bonne et simple raison qu'il n'existait pas. Et tout marche bien si j'arrête le programme après le bouton 1, puis je relance et je fais le bouton 2.
Les commandes FILE_FIND_xxx perturbent quelque part la gestion interne du répertoire courant, alors que DIR_CURRENT$ retourne la bonne valeur ! De toutes façons, la liste 2 que j'utilise, contient des chemins explicites complets, et un file_open_read avec un tel chemin d'accès DOIT réussir ! | |
| | | Invité Invité
| Sujet: Re: Arborescence des dossiers Jeu 1 Nov 2012 - 1:50 | |
| Note Pad n'a rien à voir. J'ai simplement testé ensuite en ouvrant Note Pad à l'endroit du blocage, mais évidemment le programme étant bloqué, je ne pouvais à ce moment mettre NotePad après.
Ce serait intéressant de voir si en faisant appel à un 2ème programme compilé, pourrait faire ce travail. Ce programme fait l’arborescence, et l'appel d'un autre, ouvre le fichier et le traite. |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Arborescence des dossiers Jeu 1 Nov 2012 - 11:22 | |
| J'ai fait l'essai, et c'est parfaitement concluant: 1. je génère l'exécutable analyser_sources.exe à partir de mon programme analyser_sources.bas 2. j'arrête l'éditeur 3. je lance analyser_sources.exe 4. je clique sur le premier bouton (celui de gauche) ==> la liste du milieu se remplit correctement avec mes noms de fichiers 5. je laisse ce programme ouvert et je lance un autre exemplaire de analyser_sources.exe 6. dans ce second exemplaire, je clique sur le bouton du milieu ==> le programme se déroule bien et je reçois dans la liste de droite la liste des définitions de procédures pour chaque fichier de la liste du milieu 7. je ferme ce second programme 8. je retourne dans le premier programme et clique sur le bouton du milieu ==> plantage: fichier non trouvé dès le premier fichier accédé.
J'en tire les conclusions suivantes: 1. mon code est fonctionnellement correct, puisqu'il s'exécute parfaitement en deux phases séparées 2. le problème n'est pas lié à l'éditeur Panoramic, mais bien au "run-time", donc au contexte d'exécution de l'interpréteur Panoramic 3. les fonctions FILE_FIND_xxx "cassent" quelque chose qui empêche l'interpréteur Panoramic de faire une quelconque ouverture de fichiers après cela
J'ai vraiment l'impression d'avoir mis le doigt sur un BUG. | |
| | | Invité Invité
| Sujet: Re: Arborescence des dossiers Jeu 1 Nov 2012 - 12:43 | |
| Je me demande si finalement, cela n'est pas un problème de Windows. Je parcours le programme plugiciel, que j'ai fait en commun avec AutoIt. Et j'ai eu ce genre de problème avec AutoIt. Je m'en était sorti en limitant en parti le code AutoIt, et en le reprenant avec un programme Panoramic. AutoIt ne pouvait ouvrir un fichier pour je ne sais plus quel opération j'avais fait avant, et je crois que c'était un problème d'arborescence.
|
| | | Contenu sponsorisé
| Sujet: Re: Arborescence des dossiers | |
| |
| | | | Arborescence des dossiers | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |