Page 1 sur 1

Procedure récursive

Publié : ven. 07/mai/2004 23:45
par nico
Je ne voudrais pas revenir là dessus mais il y a un code que je comprends qu'à moitié surtout que je ne comprends pas la fonction UseDirectory(directoryid).

@Flype, toi qui t'es beaucoup penché dessus, ce code de Sebi(Forum Anglais) que j'ai condensé fonctionne à merveille et sans ProcedureReturn de la fonction récursive. :? :x

Code : Tout sélectionner

Procedure.l ListFiles(directory.s , directoryid.l ) 
  Static a 
  ExamineDirectory(directoryid,directory,"*.*") 
  dirid=NextDirectoryEntry() 
  While dirid 
    If dirid=1
        file.s=DirectoryEntryName() 
            file.s=directory+"\"+DirectoryEntryName() 
            a=a+1
            Debug file 

          ElseIf dirid=2
            If Mid(DirectoryEntryName(),1,1)<>"." 
              Debug directory+"\"+DirectoryEntryName()
              ListFiles(directory+"\"+DirectoryEntryName(),directoryid+1)
          
              UseDirectory(directoryid) 
            EndIf 
    EndIf
    dirid=NextDirectoryEntry() 
  Wend 
  ProcedureReturn a 
EndProcedure 

Debug ListFiles("C:\Windows", 0) 


Je suis perdu pour l'instant! 8O

Publié : ven. 07/mai/2004 23:57
par Chris
Ben dans la ligne juste au dessus, tu as DirectoryID+1.

Au départ, ton repertoire a lID 0

Ca veut dire que quand tu rappelles la procédure, le répertoire par défaut devient celui que la fonction vient de trouver, (ID+1). Elle va donc explorer ce nouveau repertoire, et si elle trouve un autre dossier, elle va encore ajouter 1 au n° (ID) du répertoire, et en faire le repertoire par défaut.

Et ainsi de suite, jusqu'à ce qu'elle ne trouve plus de dossier.

Chris :)

Publié : sam. 08/mai/2004 0:11
par Flype
@nico

dans le post dont tu fais reference,

je disais que le procedurereturn n'est indispensable que pour certains algorithmes, pas tous. je t'ai meme donné des exemples où le procedurereturn n'etait pas obligatoire.

et en l'ocurrence, ici, on est face à un algo qui n'en a pas besoin.

Publié : sam. 08/mai/2004 1:01
par Flype
sinon j'ai un peu modifié la procedure avec #PB_ANY ( PB 3.90 )
je l'a trouve un peu mieux comme çà...

Code : Tout sélectionner

Procedure.l ListFiles( directory.s )
  Static num.l
  id.l = ExamineDirectory( #PB_ANY, directory, "*.*" )
  Repeat
    type.l = NextDirectoryEntry()
    If type = 0 : ProcedureReturn num : EndIf
    name.s = DirectoryEntryName()
    full.s = directory + "\" + name
    Select type
      Case 1 : num + 1 : Debug full
      Case 2
        If name <> ".." And name <> "."
          ListFiles( full ) : UseDirectory( id )
        EndIf
    EndSelect
  ForEver
EndProcedure
  
Debug ListFiles("C:\Windows\system32")

@nico

UseDirectory() permet de remonter l'arborescence d'un cran
quand l'algo descend en profondeur pour aller lire le contenu
d'un dossier dans un dossier...

Publié : sam. 08/mai/2004 1:30
par ZapMan
C'est du grand art !

Publié : dim. 18/juil./2004 12:19
par jblaise.cs
est-ce que je peu utiliser ton code nico?

Publié : dim. 18/juil./2004 12:37
par nico
C'est un code qui vient du forum anglais, mais vas-y c'est fait pour ça! les bouts de codes :D

Publié : lun. 19/juil./2004 22:46
par Flype
ca aussi c cado :wink:

Code : Tout sélectionner

NewList FileList.s() 

Procedure.l EnumFilesEx(dir.s,total.l) 
  id=ExamineDirectory(#PB_Any,dir,"*.*") 
  Repeat 
    type=NextDirectoryEntry() 
    If type=0 
      ProcedureReturn total 
    EndIf 
    name$=DirectoryEntryName() 
    If type=1 
      total+1 : AddElement(FileList()) 
      FileList()=dir+"\"+name$ 
    ElseIf name$<>".." And name$<>"." 
      total=EnumFilesEx(dir+"\"+name$,total) : UseDirectory(id) 
    EndIf 
  ForEver 
EndProcedure 

Procedure.l EnumFiles(dir.s) 
  ClearList(FileList()) 
  ProcedureReturn EnumFilesEx(dir.s,0) 
EndProcedure 

; Exemple: Affichage des Dlls windows 

Debug EnumFiles("C:\Windows\system32")
ForEach FileList() 
  If GetExtensionPart(FileList())="dll" 
    Debug FileList() 
  EndIf 
Next 

; Exemple: Affichage des ocx windows 

Debug EnumFiles("C:\")
ForEach FileList() 
  If GetExtensionPart(FileList())="ocx" 
    Debug FileList() 
  EndIf 
Next