Пожалуйста, обратите внимание, что пользователь заблокирован
Написал рекурсивный поиск файлов. Вроде все работает, но есть некоторые проблемы, а именно - почему-то выводятся имена "..". Хотя я пробовал сравнивать и через lstrcmp, и иначе (;&& byte ptr[fd.cFileName]!="." && word ptr[fd.cFileName]!=".."), все равно не получается.
В чем ошибка?
р.s. Большая просьба помочь именно с этим кодом. Я в курсе, что в интернете очень много примеров рекурсии, мне нужен не результат поиска файлов, а понятие сути рекурсивного поиска.
p.p.s. вероятно, код кривой и унылый, но лучше сделать не получилось.
В чем ошибка?
р.s. Большая просьба помочь именно с этим кодом. Я в курсе, что в интернете очень много примеров рекурсии, мне нужен не результат поиска файлов, а понятие сути рекурсивного поиска.
p.p.s. вероятно, код кривой и унылый, но лучше сделать не получилось.
Код:
.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\wininet.inc
include \masm32\macros\macros.asm
include \masm32\macros\windows.asm
uselib kernel32,masm32
findAll PROTO :dword
.data
fd WIN32_FIND_DATA <>
startDir db "F:\Demod",0;стартовая папка
mask0 db "*",0;маска поиска
buf1 db 256 dup(0)
.code
Start:
push offset startDir
call findAll
invoke ExitProcess,0
findAll PROC p1:dword
local buf[256]:byte;рабочий буфер
local directory[256]:byte;текущая директория
local hFindFile:dword
local directoryRes[256]:byte;резервный буфер
invoke lstrcpy,addr buf,p1;копируем то, на что указывает буфер (т.е. переданную директорию)
invoke lstrcpy,addr directory,addr buf;копируем это еще раз, для передачи в функцию
invoke lstrcpy,addr directoryRes,addr buf;и еще раз, для резерва
invoke lstrcat,addr buf,chr$("\");добавляем слеш
invoke lstrcat,addr buf,offset mask0;добавляем маску
invoke lstrlen,p1;вычисляем длину папки с маской
mov esi,eax
add esi,sizeof mask0;добавляем длину маски
mov byte ptr buf[esi],0;добавляем нуллбайт
invoke FindFirstFile,addr buf,offset fd
mov hFindFile,eax
invoke StdOut,addr buf
invoke StdOut,chr$(13,10)
.if eax==INVALID_HANDLE_VALUE; если ошибка
print "some error with FindFirstFile";уведомляем и выходим
ret
.endif
.REPEAT
.if fd.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY
invoke lstrcmp,addr fd.cFileName,chr$(".")
test eax,eax
jz FNDNext
invoke lstrcmp,addr fd.cFileName,chr$("..")
test eax,eax
jz FNDNext
;&& byte ptr[fd.cFileName]!="." && word ptr[fd.cFileName]!="..";если папка
invoke lstrcat,addr directory,chr$("\")
invoke lstrcat,addr directory,offset fd.cFileName;добавляем к текущей папке имя найденной
lea edx,directory
push edx;передаем это все в рекурсию
call findAll
.endif
FNDNext:;сюда переходим для поиска дальше
invoke FindNextFile,hFindFile,offset fd
cmp eax,0;файлы кончились,
je ende1;идем на выход
invoke StdOut,offset fd.cFileName
invoke StdOut,chr$(13,10)
nvoke RtlZeroMemory,addr buf,sizeof buf;очищаем буфер
invoke lstrcpy,addr directory,addr directoryRes;восстановить из резервной копии
.UNTIL eax==0
ende1:
invoke FindClose,hFindFile
ret
findAll ENDP
end Start