|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Мар 20, 2004 11:05:14 Кто-нить знает алгоритм поиска файлов во всех каталогах через API или другим доступным (м)асму методом. В нете куча сорцев на бейсик и на делпфи валяется, но перевести не получается. |
|
|
Дата: Мар 20, 2004 14:17:34 HANDLE FindFirstFile( LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData ); BOOL FindNextFile( HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData ); BOOL FindClose( HANDLE hFindFile ); Можно посмотреть в MSDN'е |
|
|
Дата: Мар 20, 2004 14:25:14 Поиск по дереву обычно рекурсивный. Для экономии места и времени пример на Си, по-моему перевести на асм достаточно просто. Пример реально работающий. #include<windows.h> #include<stdio.h> void FindThemAll(char*directory,char*filemask); void DoSomethingWith(char*name); void main() { char filemask[]="*.exe"; //А что же еще искать :) char directory[]="D:\\masm32\\ICZTUTES"; FindThemAll(directory,filemask); } void FindThemAll(char*directory,char*filemask) { HANDLE hSearch; WIN32_FIND_DATA wfd; char maskbuf[0x200]; //Ну на всякий случай char directorymask[]="*"; wsprintf(maskbuf,"%s\\%s",directory,filemask); // !!! на асме будет '%s\%s',0 hSearch=FindFirstFile(maskbuf, &wfd); if(hSearch!=INVALID_HANDLE_VALUE) //INVALID_HANDLE_VALUE=0xFFFFFFFF { do DoSomethingWith(wfd.cFileName); //Можно использовать и другие элементы while (FindNextFile(hSearch,&wfd)); FindClose(hSearch); } // А теперь внимание - рекурсивный поиск wsprintf(maskbuf,"%s\\%s",directory,directorymask); hSearch=FindFirstFile(maskbuf,&wfd); if(hSearch==INVALID_HANDLE_VALUE) return; do if(((wfd.dwFileAttributes)&(FILE_ATTRIBUTE_DIRECTORY)) //Если это папка &&(lstrcmp(wfd.cFileName,"..")) //Если это не родительская папка '..' &&(lstrcmp(wfd.cFileName,"."))) //Ох, и если это не '.' { wsprintf(maskbuf,"%s\\%s",directory,wfd.cFileName);//Полное имя папки FindThemAll(maskbuf,filemask); //!!! Передаем дальше } while (FindNextFile(hSearch,&wfd)); FindClose(hSearch); } void DoSomethingWith(char*name) { printf("%s\n",name); } |
|
|
Дата: Мар 20, 2004 22:08:35 · Поправил: hello_world Ищет файлы на диске С и кладет в буффер имена разделенные нулями. Если хочешь на всех дисках, юзай GetLogicalDriveStrings pushsz macro sz:req n = 0 forc ch,sz ifdif <ch>,<!'> n = n + 1 endif endm call $ + n + 6 db sz,0 endm SearchDriveC proc lpszSearchMask :dword,\ lpFileArray :dword,\ dwFileArraySize :dword local w32fd :WIN32_FIND_DATA local dwStackTop :dword local hDirSearch :dword local hFileSearch :dword local DirBuf[250] :byte push ebx push edi push esi mov dwStackTop,esp sub ebx,ebx sub al,al mov edi,lpFileArray mov ecx,dwFileArraySize rep stosb pushsz 'c:\' call SetCurrentDirectory ___NextDir: invoke FindFirstFile,\ lpszSearchMask,\ addr w32fd cmp eax,INVALID_HANDLE_VALUE jz ___NoFiles mov hFileSearch,eax ___FindNextFile: sub eax,eax lea esi,DirBuf mov edi,esi mov ecx,250 rep stosb mov edi,lpFileArray inc edi dec edi scasw jnz $ - 3 dec edi invoke GetCurrentDirectory,\ 250,\ esi @@: movsb cmp byte ptr [esi],0 jnz @b mov al,'\' cmp byte ptr [edi - 1],al jz @f stosb @@: lea esi,w32fd.cFileName @@: movsb cmp byte ptr [esi],0 jnz @b invoke FindNextFile,\ hFileSearch,\ addr w32fd test eax,eax jnz ___FindNextFile invoke CloseHandle,\ hFileSearch ___NoFiles: lea eax,w32fd push eax pushsz '*' call FindFirstFile mov hDirSearch,eax ___SearchDir: cmp byte ptr [w32fd.cFileName],'.' jz @f and dword ptr [w32fd.dwFileAttributes],FILE_ATTRIBUTE_DIRECTORY jz @f push hDirSearch invoke SetCurrentDirectory,\ addr w32fd.cFileName jmp ___NextDir @@: invoke FindNextFile,\ hDirSearch,\ addr w32fd test eax,eax jnz ___SearchDir invoke CloseHandle,\ hDirSearch cmp esp,dwStackTop jz @f pop hDirSearch pushsz '..' call SetCurrentDirectory test eax,eax jnz @b @@: pop esi pop edi pop ebx ret SearchDriveC endp |
|
|
Дата: Мар 21, 2004 10:37:44 Спасибо огромное. Сейчас проверю. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.064 |