Recherche de fichier recursif

maximus4 Messages postés 19 Date d'inscription mercredi 5 mars 2003 Statut Membre Dernière intervention 23 août 2010 - 31 juil. 2009 à 12:11
maximus4 Messages postés 19 Date d'inscription mercredi 5 mars 2003 Statut Membre Dernière intervention 23 août 2010 - 4 août 2009 à 11:37
Bonjour,
j'ai la procédure suivante pour la recherche récursive, le résultat est stocké dans un fichier texte.
invoke CreateFile,offset file, GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_HIDDEN,NULL
mov hReadWriteInput,eax

ScanRep PROC uses ebx edi esi addrRep:DWORD
LOCAL Scan[500]                :BYTE
LOCAL wfd                      :WIN32_FIND_DATA
LOCAL hFile                    :HANDLE
LOCAL tailleChemin             :DWORD
LOCAL SizeReadWrite 			:DWORD

        jmp _MyJump
                                _backSlash              db "",0
                                _etoilePointEtoile      db "*.*",0
                                _FichierInvalide        db "Fichier invalide",0
                                _retChar				db 13,10,0
        _MyJump:

        lea esi, wfd
        lea edi, Scan
        invoke lstrcpy, edi, addrRep
        invoke lstrlen, edi
        mov tailleChemin, eax
        invoke lstrcat, edi, addr _backSlash
        invoke lstrcat, edi, addr _etoilePointEtoile
        invoke FindFirstFile, edi, esi
        .if eax==INVALID_HANDLE_VALUE
                invoke MessageBox, 0, edi, addr _FichierInvalide, 20h
        .else
                mov hFile, eax
                mov ebx, tailleChemin
                mov byte ptr [edi+ebx], 0
                .while TRUE
                        invoke FindNextFile, hFile, esi
                        .break .if eax == 0
                        .if dword ptr [esi] != FILE_ATTRIBUTE_DIRECTORY
                                mov eax, esi
                                add eax, 2Ch
                                ;################# COEUR ###############
                                ; Ici se trouve la sortie des données
                                ; eax pointe sur le nom du Fichier
                                ; edi pointe sur le nom du Répertoire
                                ;invoke MessageBox, 0, edi, eax, 20h
                                push eax
                                invoke lstrcat, addr buffer, addr _retChar
                                invoke lstrcpy, addr buffer, edi
                                invoke lstrcat, addr buffer, addr _backSlash
                                pop eax
                                invoke lstrcat, addr buffer, eax
                                push eax
                                invoke lstrcat, addr buffer, addr _retChar
                                invoke lstrlen, addr buffer
                                mov SizeReadWrite, eax
                                invoke WriteFile, hReadWriteInput, addr buffer,SizeReadWrite, addr Nbr_Octet_Ecrit, 0
                                pop eax
                                ;invoke MessageBox, 0, addr buffer, edi, 20h

                                ;#######################################
                        .endif
                .endw
                invoke FindClose, hFile
                mov ebx, tailleChemin
                mov byte ptr [edi+ebx], ""
                ;----------------------------------------------------------
                ; A ce niveau on a affiché tous les fichiers
                ; contenus dans le répertoire courrant. Reste à retrouver
                ; les sous-répertoires pour y entrer en rappellant cette
                ; même procédure. Procédure récursive
                lea esi, wfd
                lea edi, Scan

                invoke FindFirstFile, edi, esi
                        mov hFile, eax
                        .while TRUE
                                invoke FindNextFile, hFile, esi
                                .break .if eax == 0
                                .if dword ptr [esi] == FILE_ATTRIBUTE_DIRECTORY
                                        mov eax, esi
                                        add eax, 2Ch
                                       	.if byte ptr [eax] != "."
                                                mov edx, tailleChemin
                                                mov byte ptr [edi+edx+1], 0
                                                invoke lstrcat, edi, eax
                                                invoke ScanRep, edi
                                        .endif
                                .endif
                        .endw
                invoke FindClose, hFile
                ;----------------------------------------------------------
        .endif
ret
ScanRep ENDP


Le problème c'est que tous les fichiers ne sont pas répertorier dans ce fichier

Merci d'avance
_-=|*max*|=-_

3 réponses

Guilou34 Messages postés 142 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 29 janvier 2016 1
31 juil. 2009 à 23:58
Il y a quelque chose qui m'échappe peut être mais je ne comprends pas pourquoi dans la première boucle WHILE TRUE on néglige les répertoires ni non plus comment on revient au début du fichier pour les traiter ensuite.
N'est-il pas plus logique d'appeler récursivement traitement_repertoire chaque fois qu'on en rencontre un, le retour ayant lieu après en avoir traité la dernière entrée?
Amicalement
0
maximus4 Messages postés 19 Date d'inscription mercredi 5 mars 2003 Statut Membre Dernière intervention 23 août 2010
1 août 2009 à 00:48
Absolument en réalité j'étais parti dans la logique d'afficher dans mon fichier texte l'intégralité du répertoire de base avant de traiter les sous répertoires un a un j'aurais pu faire :

ScanRep PROC uses ebx edi esi addrRep:DWORD
LOCAL Scan[500]                :BYTE
LOCAL wfd                      :WIN32_FIND_DATA
LOCAL hFile                    :HANDLE
LOCAL tailleChemin             :DWORD
LOCAL SizeReadWrite 			:DWORD

        jmp _MyJump
                                _backSlash              db "",0
                                _etoilePointEtoile      db "*.*",0
                                _FichierInvalide        db "Fichier invalide",0
                                _retChar				db 13,10,0
        _MyJump:

lea esi, wfd
        lea edi, Scan
        invoke lstrcpy, edi, addrRep
        invoke lstrlen, edi
        mov tailleChemin, eax
        invoke lstrcat, edi, addr _backSlash
        invoke lstrcat, edi, addr _etoilePointEtoile
        invoke FindFirstFile, edi, esi
        .if eax==INVALID_HANDLE_VALUE
                invoke MessageBox, 0, edi, addr _FichierInvalide, 20h
        .else
                mov hFile, eax
                mov ebx, tailleChemin
                mov byte ptr [edi+ebx], 0
                .while TRUE

                        invoke FindNextFile, hFile, esi
                        .break .if eax == 0
                        .if dword ptr [esi] != FILE_ATTRIBUTE_DIRECTORY
                                mov eax, esi
                                add eax, 2Ch
                                ;invoke MessageBox, 0, edi, eax, 20h
 ;################# COEUR ###############
                                ; Ici se trouve la sortie des données
                                ; eax pointe sur le nom du Fichier
                                ; edi pointe sur le nom du Répertoire
                                ;invoke MessageBox, 0, edi, eax, 20h
                                push eax
                                invoke lstrcat, addr buffer, addr _retChar
                                invoke lstrcpy, addr buffer, edi
                                invoke lstrcat, addr buffer, addr _backSlash
                                pop eax
                                invoke lstrcat, addr buffer, eax
                                push eax
                                invoke lstrcat, addr buffer, addr _retChar
                                invoke lstrlen, addr buffer
                                mov SizeReadWrite, eax
                                invoke WriteFile, hReadWriteInput, addr buffer,SizeReadWrite, addr Nbr_Octet_Ecrit, 0
                                pop eax
                                ;invoke MessageBox, 0, addr buffer, edi, 20h

                                ;#######################################
                                ;#######################################

                        .else
                                mov eax, esi
                                add eax, 2Ch
                                .if byte ptr [eax] != "."
                                         mov edx, tailleChemin
                                         mov byte ptr [edi+edx], ""
                                         mov byte ptr [edi+edx+1], 0
                                         invoke lstrcat, edi, eax
                                         invoke ScanRep, edi
                                         mov ebx, tailleChemin
                                         mov byte ptr [edi+ebx], 0
                                .endif
                        .endif
                .endw
                invoke FindClose, hFile
        .endif
ret
ScanRep ENDP


mais le résultat est le même il manque toujours des fichiers
0
maximus4 Messages postés 19 Date d'inscription mercredi 5 mars 2003 Statut Membre Dernière intervention 23 août 2010
4 août 2009 à 11:37
0
Rejoignez-nous