Здравствуйте. Помогите реализовать сканер директорий: Использую FindFirstFile и FindNextFile... Но при использовании данной функции вложенная папка воспринимается как файл... Это мне не подходит Что я имею: Код (Text): Invoke FindFirstFile, Addr mytestpath, Addr wfd .If Eax == INVALID_HANDLE_VALUE Invoke MessageBoxA, NULL, 0, 0, MB_ICONERROR Invoke ExitProcess, 0 .EndIf Mov hFind, Eax @@: Invoke FindNextFile, hFind, Addr wfd .If Eax != 0 Invoke lstrcmp, Addr wfd.cFileName, Addr dot .If Eax != 0 Invoke lstrcmp, Addr wfd.cFileName, Addr ddot .If Eax != 0 Invoke MessageBoxA, NULL, Addr wfd.cFileName, 0, MB_OK .EndIf .EndIf Jmp @B .EndIf Как реализовать "вхождение" сканера в субдиректории?!
По совету поставил Вместо Код (Text): mytestpath DB 'C:\www\*', 0 Поставить Код (Text): mytestpath DB 'C:\www\*.*', 0 Всеравно не срабатывает
Код (Text): fScanFiles proc uses EBX ECX EDX EDI, sCurDir:DWORD,sMask:DWORD,hOutList:DWORD mySTACK struct h1 dd 00h h2 dd 00h h3 dd 00h h4 dd 00h h5 dd 00h h6 dd 00h h7 dd 00h h8 dd 00h h9 dd 00h h10 dd 00h h11 dd 00h h12 dd 00h mySTACK ends LOCAL sFName :DWORD LOCAL cWFD :WIN32_FIND_DATA LOCAL hFile :DWORD LOCAL cStack :mySTACK LOCAL iDirLong :DWORD LOCAL iMaskLong :DWORD .data ? sSrStr byte ? .code invoke lstrlen,sCurDir push EAX pop iDirLong invoke lstrlen,sMask push EAX pop iMaskLong lea ESI,sCurDir lea EDI,sSrStr movsb mov EDI, -4 lFirst: invoke FindFirstFile,sCurDir,addr cWFD ;поиск первого файла в дир-ии push EAX ;через стек pop hFile ;сохраняем хендл полученного файла cmp hFile,INVALID_HANDLE_VALUE ;если нет ошибки jne lCheck ;то обрабатываем полученный файл jmp lErrorExit lCheck: lea EAX, cWFD.cFileName ;в EAX указатель на имя файла cmp byte ptr [EAX], '.' ;если первый байт имени файла = ".", je lFindNext ;то ищем следующий файл mov sFName,EAX ;иначе покажем invoke SendMessage,hOutList,LB_ADDSTRING,0,sFname ;имя файла в ListBox cmp cWFD.dwFileAttributes, FILE_ATTRIBUTE_DIRECTORY ;найденный файл - директория? jne lValidPE ;если нет, то проверим PE он или нет ;если же дир-ия, то необходимо сформировать новый путь для поиска mov EBX, [sCurDir] ;в EBX указатель на строку с директорией invoke lstrlen, EBX ;выясняем ее длину mov byte ptr [EBX+EAX]-3, 00h ;сокращаем строку на 3, т.о. избавляемся от '*.*' lea EAX, cWFD.cFileName ;в EAX указатель на имя файла invoke lstrcat, EBX,EAX ;сцепляем sCurDir с именем поддиректории invoke lstrlen, EBX ;выясняем новую длину строки с дир-ей mov dword ptr [EBX+EAX], '*.*\' ;добавляем '\*.*' в конец пути mov byte ptr [EBX+EAX+4], 00h ;и признак конца строки ;новая директория для поиска сформирована ;сохранение хендла текущего файла lea EDX, cStack ;в EDX указатель на структуру add EDI, 04h ;увеличиваем указатель "нашего" стека push hFile ;через стек pop [EDX+EDI] ;сохраняем хендл в наш специальную структуру-фрейм jmp lFirst ;новый поиск в новой директории lFindNext: ;поиск следующего файла invoke FindNextFile, hFile, addr cWFD ;ф-ия поиска с пар-ми: хендл текущего файла и структура WIN32_FIND_DATA test EAX,EAX ;или если ф-ия завалилась je lexitFindNext ;то на метку обработки ошибок jmp lCheck ;иначе прыжок на обработку нового файла lexitFindNext: invoke GetLastError ;возвращает статус последней ошибки в EAX cmp EAX, ERROR_NO_MORE_FILES ;если файлов в папке больше нет je lReturn ;то на метку возврата в пред. дир-ию или завершения, если некуда возвращатся cmp EAX, INVALID_HANDLE_VALUE ;или если ф-ия вернула "плохой" хендл je lFindNext ;то ищем дальше jmp lErrorExit ;в остальных случаях выходим с ошибкой lValidPE: ; ;is valid PE file ; jmp lFindNext ;продолжаем поиск lReturn: ;далее происходит возврат в предыдущуу дир-ию или завершение invoke lstrlen, sCurDir ;выясняем - не нашли ли мы последний файл в стартовой дир-ии cmp EAX,iDirLong ;путем сравнения длины строки текущей дир-ии и стартовой je Fin ;если да, то прыгаем на завершение lea EDX,cStack ;иначе необходимо восстановить старый хендл push [EDX+EDI] ;из специального фрейма ("нашего" стека) pop hFile ;в переменную hFile ;удаление из sCurDir символов до "\" и прибавление "\*.*00" mov EBX, [sCurDir] ;в EBX указатель на строку с дир-ей sub EAX, 4 ;последние 4 символа нас не интересуют - отбрасываем их сразу lSymbCmp: ;далее идет поиск символа "\" dec EAX ;уменьшаем EAX, т.о. передвигаемся к началу строки cmp byte ptr [EBX+EAX], '\' ;сравнение следующего символа строки с символом "\" jne lSymbCmp ;если не равен, то проверяем дальше mov dword ptr [EBX+EAX],'*.*\' ;добавляем символы фильтра для поиска mov byte ptr [EBX+EAX+4],00h ;и признак конца строки sub EDI, 04h ;уменьшаем указатель на наш "стек" jmp lFindNext ;прыгаем на поиск следующего файл в сформированной дир-ии lErrorExit: mov EAX,0 Fin: ;поиск завершен ret ;возврат fScanFiles endp ;конец функции Функа еще хранит хэндлы ( зачем-то же было мне это нужно %) ). Убери лишнее, короче.