maximus4
Messages postés19Date d'inscriptionmercredi 5 mars 2003StatutMembreDernière intervention23 août 2010
-
31 juil. 2009 à 12:11
maximus4
Messages postés19Date d'inscriptionmercredi 5 mars 2003StatutMembreDernière intervention23 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.
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
Guilou34
Messages postés142Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention29 janvier 20161 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
maximus4
Messages postés19Date d'inscriptionmercredi 5 mars 2003StatutMembreDernière intervention23 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