push offset dwFindAttr;структура
push offset dbFindMask;маска поиска
call FindFirstFileA;21Ѕ:°Ѕ=4µЅ
;проверяем была ли ошибка
cmp eax,-1;INVALID_HANDLE_VALUE
jnz noErrorFindFirst
;тут Вы обрабатываете саму ошибку получая её код вызовом GetLastError
call GetLastError
. . .
. . .
;find is succeeds eax=hFindFile
noErrorFindFirst:
mov hFindFile,eax;handle for current find round
.386
.model flat
includelib ..\Tasm\TASM5\LIB\imp32i.lib
MAX_PATH equ 260
extrn ExitProcess:near
extrn MessageBoxA:near
extrn GetCurrentDirectoryA:near
extrn SetCurrentDirectoryA:near
extrn FindFirstFileA:near
extrn FindNextFileA:near
extrn FindClose:near
extrn GlobalAlloc:near
extrn GlobalLock:near
extrn GlobalFree:near
extrn GetLastError:near
.data
dbFindTitle db 'Compare files',0
;mask for find
dbFindMask db '*.*',0
;
dbErrorLongName db 'error:very log name',0
dbErrorAllocMemory db 'error:alloc memory',0
dbErrorSetFolder db 'error:set current folder',0
dbErrorGetFolder db 'error;get current folder',0
dbErrorFindClose db 'error:find close',0
dbErrorFindFirst db 'error:find first file',0
dbErrorFindNext db 'error:find next file',0
dbErrorDispose db 'error:dispose memory',0
StopFind db 'is stop',0
GoJob db 'show mast go on',0
;data for folder
;data for find
hFindFile dd ?
lpFirstFolder dd ?
lpFirstFile dd ?
dwFindAttr dd ?;file attributes
dd ?,?;time of file creation
dd ?,?;time of last file access
dd ?,?;time of last write access
dwHighSize dd ?;high-order word of file size
dwLowSize dd ?;low-order word of file size
dd ?;(reserved)
dd ?;(reserved)
dbFindName db MAX_PATH dup(?);matching file name
dbFindAName db 14 dup(?);8.3 alias name
lpThisFolder dd ?
lpLastFolder dd ?
lpLastFile dd offset lpFirstFile
.code
start: cld
;---------------
;получаем текущую директорию
push offset dbFindName;указатель куда будет записан путь к директории
push MAX_PATH;максимальная длина
call GetCurrentDirectoryA;21Н:АН=47Н
;проверяем ошибку работы функии
or eax,eax
jnz noErrorGetFolder
mov edx,offset dbErrorGetFolder
jmp ErrorMessage
;начинаем работать
noErrorGetFolder:
mov ecx,eax
mov lpThisFolder,eax
add ecx,08
call GetMemory;
mov ecx,lpThisFolder
mov edi,eax
mov esi,offset dbFindName
mov lpFirstFolder,eax
mov lpThisFolder,eax
mov lpLastFolder,eax
xor eax,eax
stosd
mov eax,ebx
stosd
;begin copy
rep movsb
xor eax,eax
stosb
;
;---------------BEGIN FIND IN THIS FOLDER
;
;поиск первого файла в каталоге
beginFind: push offset dwFindAttr;аттрибуты для поиска
push offset dbFindMask;маска поиска
call FindFirstFileA;21Н:АН=4ЕН
;контроль ошибки
cmp eax,-1;INVALID_HANDLE_VALUE
jnz noErrorFindFirst
mov edx,offset dbErrorFindFirst
jmp ErrorMessage
;find is succeeds eax=hFindFile
noErrorFindFirst:
mov hFindFile,eax;handle for current find round
;проверяем это папка или файл
findNext: mov eax,dwFindAttr
test eax,10h;FILE_ATTRIBUTE_DIRECTORY
jz isFileNow;если не папка переходим на обработку файлов
;---------------BEGIN FOLDER SECTION
;это папка
mov al,dbFindName
cmp al,'.'
jz skipFolder
call CheckLongName;контрольдлины файла
;calculation for memory reqest
mov esi,lpThisFolder
lodsd
call checkLong
add ecx,08
call GetMemory
mov esi,lpLastFolder
mov edi,eax
mov [esi],eax
mov lpLastFolder,eax
xor eax,eax
stosd ;save NULL in cuurent folder block
mov eax,ebx
stosd ;save alloc handle for dispose
mov esi,lpThisFolder
lodsd
;copy current folder path
copyPath: lodsb
stosb
or al,al
jnz copyPath
dec edi
mov al,'\'
stosb
nameCopy: mov esi,offset dbFindName
;---------------END FOLDER SECTION
;
;---------------BEGIN FILE AND FOLDER SECTION
;copy folder name
copyName: lodsb
stosb
or al,al
jnz copyName
;in memory block save new null(4)+new element for find
skipFolder: push offset dwFindAttr
push hFindFile
call FindNextFileA
;check last error
or eax,eax
jnz findNext
;---------------END FILE AND FOLDER SECTION
;
;---------------CHECK FIND ERROR
call GetLastError
cmp eax,18;ERROR_NO_MORE_FILES
jz noErrorFindNext
mov edx,offset dbErrorFindNext
jmp ErrorMessage
;close this find round
noErrorFindNext:
push hFindFile
call FindClose
;check error
or eax,eax
jnz noErrorFindClose
mov edx,offset dbErrorFindClose
jmp ErrorMessage
;change current folder
noErrorFindClose:
mov esi,lpThisFolder
mov eax,[esi]
;check next folder is not NULL
or eax,eax
jnz noFindStop
jmp FindStop
noFindStop: mov lpThisFolder,eax
mov esi,eax
lodsd;skip next pointer
lodsd;skip handle alloc
push esi
call SetCurrentDirectoryA
or eax,eax
jnz beginFind
;---------------END FIND IN THIS FOLDER
;is error set new curent directory
mov edx,offset dbErrorSetFolder
jmp ErrorMessage
;
;---------------BEGIN FILE SECTION
isFileNow: call CheckLongName
add ecx,20
call GetMemory
mov edi,eax
mov esi,lpLastFile
mov [esi],edi
mov lpLastFile,eax
xor eax,eax
stosd;+0
mov eax,ebx
stosd;+4
mov eax,lpThisFolder;pointer to directory
stosd;+8
mov eax,dwHighSize
stosd;+12
mov eax,dwLowSize
stosd;+16
jmp nameCopy
;---------------END FILE SECTION
;
;---------------BEGIN COMPARE SECTION
FindStop:
;---------------BEGIN PROCEDURE SECTION
;
;подпрограмма получения свободной памяти
GetMemory: shr ecx,4;выравнивае на 16
inc ecx
shl ecx,4
;получаем память
push ecx;размер запрашиваемой памяти
push 2;GMEM_MOVEABLE
call GlobalAlloc
;контрольошибки резервирования
or eax,eax
jz ErrorAllocMemory
;переводим указатель в адрес
mov ebx,eax
push eax
call GlobalLock
jz ErrorAllocMemory
ret
ErrorAllocMemory:
mov edx,offset dbErrorAllocMemory
jmp short ErrorNext
;
;контроль длины имени
CheckLongName: mov esi,offset dbFindName
xor ecx,ecx
checkLong: lodsb
inc ecx
;контроль очень длиного имени
cmp ecx,MAX_PATH
jg ErrorLongName
or al,al
jnz checkLong
ret
ErrorLongName: mov edx,offset dbErrorLongName
ErrorNext: pop edi
;error message and exit
ErrorMessage: call OutMessage
;
;dispose all alloc memory in current process
;освоождаем всю занятую память
mov esi,lpFirstFolder
call doDispose;под папки
mov esi,lpFirstFile
call doDispose;под файлы
push 0
call ExitProcess;выход
;выводим сообщение
OutMessage: push 0
push offset dbFindTitle
push edx
push 0
call MessageBoxA
ret
;только для котроля
ShowJob: mov esi,lpFirstFile
jobNow: mov edx,20
or esi,esi
je stopExit
add edx,esi
call OutMessage
mov esi,[esi]
jmp jobNow
stopExit: ret
;освобождаем всю занятую память
doDispose: mov eax,[esi+4]
mov edi,[esi]
push eax
call GlobalFree
or edi,edi
jz goDispose
mov esi,edi
or eax,eax
jz doDispose
mov edx,offset dbErrorDispose
call OutMessage
goDispose: ret
end start
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.