Здравствуйте помгите пожалуйста советом . Мне нужна функция поиска директорий по заданным названием на всех дисках компа. Как это можно реализовать? за примеры огромное спасибо
подскажи в какой ман заглянуть? msdn слово их 4х букв (не х** (подразумевается не хочу, хотя каждый мыслит в меру своей испорченности) отсюда ответ "хочу", то есть хочу посмотреть этот мануал дошло?
Код (Text): format PE GUI 4.0 ; PE EXE файл entry start ; Точка входа include 'include\win32a.inc' section '.main' code readable writeable executable ; Секция кода ; и данных buf rb 500h ; Буффер для имени директории fake1 dd '.',0 ; Дирекории, которые fake2 dd '..',0 ; НЕ надо сканировать start: ; Начало основной ; Программы push 1h ; SEM_FAILCRITICALERRORS call [SetErrorMode] ; Установим error mode ; что бы в случае обращения ; к недоступному диску ; не вываливалось сообщение call [GetLogicalDrives] ; Получаем список дисков, ; существующих в системе mov ecx,25 ; Будем проверять, начиная с Z:\ .find_drives: mov ebx,1 ; Нехитрые опрерации в shl ebx,cl ; ходе которых мы выясняем and ebx,eax ; присутствует диск в je .no_disk ; системе или нет ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; На всякий случай, пояснение из MSDN: ; ; ;---------------------------------; ; ; DWORD GetLogicalDrives(void); ; ; ;---------------------------------; ; ; Return Values: ; -------------- ; If the function succeeds, the return value is a bitmask ; representing the currently available disk drives. ; Bit position 0 (the least-significant bit) is drive A, ; bit position 1 is drive B, bit position 2 is drive C, and so on. ; ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ add cl,65 ; Если да, то добавим mov byte [buf],cl ; букву диска в sub cl,65 ; буффер mov dword [buf+1],':\*.' ; Сформируем строку mov byte [buf+5],'*' ; для поиска, вида, mov byte [buf+6],0 ; например, C:\*.* push eax ; Сохраняем в стеке push ecx ; нужные регистры call find_files ; Вызываем процедуру поиска pop ecx ; Восстанавливаем pop eax ; регистры .no_disk: ; Если диска нет, dec ecx ; то проверяем следующий jge .find_drives ; пока ecx>0 push 0 ; Выходим из call [ExitProcess] ; программы fd WIN32_FIND_DATA ; структура WIN32_FIND_DATA find_h dd ? proc find_files ; Рекурсивная процедура ; поиска файлов ; Локальные переменные: ; и хэндл поиска ; Вход в процедуру lea eax,[fd] ; Вычисляем и кладем в стек push eax ; указатель на стуктуру find data push buf ; Указатель на имя директории, где искать call [FindFirstFile] ; Ищем inc eax ; Если ничего je .exit ; не нашли - выходим dec eax ; Иначе, сохраним mov [find_h],eax ; хэндл поиска .find_next: mov eax,[fd.dwFileAttributes] ; Проверяем, нашли and eax,FILE_ATTRIBUTE_DIRECTORY ; директорию? je .found ; Если нет - прыгаем на .found lea eax,[fd.cFileName] ; Проверяем, push eax ; вдруг это push fake1 ; "." call [lstrcmp] ; test eax,eax ; Если да, je .next ; ищем следующий файл lea eax,[fd.cFileName] ; Проверяем, push eax ; вдруг это push fake2 ; ".." call [lstrcmp] ; test eax,eax ; Если да je .next ; ищем следующий файл push buf ; Вычислим call [lstrlen] ; длину строки sub eax,3 ; вычтем *.* push eax ; сохраним полученную длину mov byte [buf+eax],0 ; Если мы всё-таки lea eax,[fd.cFileName] ; нашли директорию push eax ; то прибавляем push buf ; её имя к текущей call [lstrcat] ; папке push buf ; Опять вычислим call [lstrlen] ; длину получившейся строки mov dword [buf+eax],'\*.*' ; и прибавим mov byte [buf+eax+4],0 ; \*.* для поиска call find_files ; Вызываем процедуру ; поиска для найденной ; директории pop eax ; Восстановим mov dword [buf+eax-1],'\*.*' ; имя прежней mov byte [buf+eax+3],0 ; директории jmp .next ; Ищем следующий файл .found: lea eax,[fd.cFileName] push eax call [lstrlen] cmp dword [fd.cFileName+eax-4],'.txt' ; Проверим расширение файла jne .next ; Если не совпадает ищем дальше lea eax,[fd.cFileName] push 0 ; push eax ; push eax ; push 0 ; Покажем MessageBox с call [MessageBox] ; именем найденного файла .next: lea eax,[fd] ; Кладем в стек указатель push eax ; на структуру find_data push [find_h] ; Хэндл текущего поиска call [FindNextFile] ; Ищем следующий файл test eax,eax ; jne .find_next ; Если ничего не нашли, push [find_h] ; то закрываем call [FindClose] ; хэндл поиска .exit: ; return ; Выход endp data import ; Импорт нужных API-функций library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL' include 'include\APIA\kernel32.inc' include 'include\APIA\user32.inc' end data
> fake1 dd '.',0 как всё запущенно.. Тем более, товарищу поиск папки нужен был. rewo Смотри MSDN и поиск по форуму тоже - был пример.