scan_dir(dir) { foreach (file in dir) { if (file.attr==DIRECTORY && file.name!="." && file.name!="..") { scan_dir(file); } else { process_file(file); } } } можно мне еще пива? %)
Ключевые слова -- recursive FindFirstFile FindNextFile FindClose Перечисляешь файлы, для файлов с аттрибутом FILE_ATTRIBUTE_DIRECTORY вызываешь ф-цию перечисления рекурсивно. Проще, конечно, найти примеры на C/C++, на ASM перевести не должно быть проблемой.
Код (Text): #include <stdio.h> #include <string.h> #include <windows.h> #include <conio.h> #include <iostream.h> #include <vcl.h> #include <fcntl.h> #include <io.h> void FindDir(char* path,char* mask) { WIN32_FIND_DATA wfd; HANDLE hfound; char newpath[MAX_PATH]; char fpath[MAX_PATH]; strcpy(fpath,path);//Copies one string to another. strcat(fpath,"\\");//Appends one string to another. strcat(fpath,mask); if((hfound=FindFirstFile(fpath,&wfd))!=INVALID_HANDLE_VALUE) {//Compares two strings to determine if they are the same. The comparison is case-sensitive. if(!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,".")) { //значит нашли первый файл в папке path и делаем что-нибудь //fpath - здесь думаю разбересся ;) //wfd.cFileName - здесь тем более )) } while(FindNextFile(hfound,&wfd)) { if(!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,".")) { //значит нашли первый файл в папке path и делаем что-нибудь //fpath - здесь думаю разбересся ;) //wfd.cFileName - здесь тем более )) } } } FindClose(hfound);//поиск файлов закончили, теперь ищем подпапки strcpy(fpath,path); strcat(fpath,"\\*.*"); if((hfound=FindFirstFile(fpath,&wfd))!=INVALID_HANDLE_VALUE) { if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,".")) { strcpy(newpath,path); strcat(newpath,"\\"); strcat(newpath,wfd.cFileName); FindDir(newpath,mask); //ЭТО НАЗЫВАЕТСЯ "РЕКУРСИЯ" } while(FindNextFile(hfound,&wfd)) { if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,".")) { strcpy(newpath,path); strcat(newpath,"\\"); strcat(newpath,wfd.cFileName); FindDir(newpath,mask); //ЭТО НАЗЫВАЕТСЯ "РЕКУРСИЯ" } } } } WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { FindDir("C:","*."); return 0; } //---------------------------------------------------------------------------
Вот для вывода всех подключей HKEY_CURRENT_USER думаю для файлов переделать не сложно Код (Text): IMAGE_BASE = 400000h HKEY_CLASSES_ROOT = 80000000h HKEY_CURRENT_USER = 80000001h HKEY_LOCAL_MACHINE = 80000002h format PE CONSOLE at IMAGE_BASE include 'win32a.inc' section '.code' code readable executable invoke GetStdHandle, STD_OUTPUT_HANDLE mov [hOutput], eax push eax stdcall print, szHK, 0 invoke RegOpenKey, HKEY_LOCAL_MACHINE, szHard, hSubKey test eax, eax jnz @F stdcall PrintKeys, [hSubKey], 1 @@: call [CloseHandle] ret proc PrintKeys hKey, nLevel pushad xor esi, esi @@: invoke RegEnumKey, [hKey], esi, lpName, 256 test eax, eax jnz @F inc esi stdcall print, lpName, [nLevel] invoke RegOpenKey, [hKey], lpName, hSubKey test eax, eax jnz @B mov eax, [nLevel] inc eax stdcall PrintKeys, [hSubKey], eax jmp @B @@: invoke RegCloseKey, [hKey] popad ret endp proc print lpString, nLevel pushad mov edi, szTabs mov eax, 020202020h mov ecx, [nLevel] mov edx, ecx rep stosd shl edx, 2 invoke WriteFile, [hOutput], szTabs, edx, nWriten, 0 invoke lstrlen, [lpString] invoke WriteFile, [hOutput], [lpString], eax, nWriten, 0 invoke WriteFile, [hOutput], szCRLF, 2, nWriten, 0 popad ret endp
Crazy_Death а в чем именно мутность заключаеться? 1) автор не знает о существовании конструкции do ... while; 2) при перечислении файлов нет необходимости сравнивать имя с "." и ".."; 3) после перебора каталогов отсутствует FindClose; 4) нет необходимости на каждой итерации резервировать в стеке 2 * MAX_PATH + sizeof (WIN32_FIND_DATA). PS если код не собственный, то справедливо постить ссылку, а не сам код, если страницы с кодом больше нет, то указывать автора, а то получается, что _ты_ написал не вполне хороший вариант.
IceStudent зачем отдельно вызывать поиск каталогов и файлов? Потому что в этом варианте можно искать файлы по маске и не все подкаталоги могут ей соответствовать.