Функция EraseDir удаляет указанную папку. Если у файла(папки) установлен атрибут FILE_ATTRIBUTE_READONLY - функция должна убирать этот атрибут. Но иногда попадаются такие папки, в которые функция не может "зайти" - функция определяет эти папки как файлы. Видимо дело в атрибутах? Вопрос:как правильно изменить любые атрибуты папки, чтобы у неё остался один - FILE_ATTRIBUTE_DIRECTORY ? Код (Text): EraseDir proc directory:DWORD LOCAL searchfilter[MAX_PATH]:BYTE LOCAL filepath[MAX_PATH]:BYTE LOCAL predir[MAX_PATH]:BYTE LOCAL hfind:DWORD LOCAL wfd:WIN32_FIND_DATA jmp @F pathanymask db "\*",0 updirmask db "..",0 curdirmask db ".",0 slash db "\",0 @@: invoke lstrcpy,addr searchfilter,directory invoke lstrcat,addr searchfilter,addr pathanymask invoke FindFirstFile,addr searchfilter,addr wfd .if eax!=INVALID_HANDLE_VALUE mov hfind,eax .while eax!=0 invoke lstrcpy,addr filepath,directory invoke lstrcat,addr filepath,addr slash invoke lstrcat,addr filepath,addr wfd.cFileName invoke GetFileAttributes,addr filepath .if eax==FILE_ATTRIBUTE_READONLY and eax,NOT FILE_ATTRIBUTE_READONLY invoke SetFileAttributes,addr filepath,eax .endif .if wfd.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY invoke lstrcmp,addr wfd.cFileName,addr updirmask .if eax!=0 invoke lstrcmp,addr wfd.cFileName,addr curdirmask .if eax!=0 invoke EraseDir,addr filepath .endif .endif .else invoke DeleteFile,addr filepath .endif invoke FindNextFile,hfind,addr wfd .endw invoke FindClose,hfind .endif invoke RemoveDirectory,directory ret EraseDir endp
Неверная проверка атрибутов. Наличие атрибута означает выставленный флаг (бит) в двойном слове атрибутов. Соответственно, чтобы проверить наличие атрибута, нужно проверять не на равенство всего слова какому-либо значению, а на наличие соответствующего бита. Например, если побитовое "и" (операция test) с соответствующей маской (которой в свою очередь и является соответствующая константа типа FILE_ATTRIBUTE_READONLY или FILE_ATTRIBUTE_DIRECTORY) дает ненулевой результат, то бит, выставленный в маске, выставлен также и в проверяемом двойном слове атрибутов.
в дополнение к ответу l_inc: в твоём коде замени == на & там, где требуется операция test например: Код (Text): .If eax&FILE_ATTRIBUTE_READONLY ...