· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Поиск файла

Посл.отвђт Сообщен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