Как правильно изменить атрибуты папки

Тема в разделе "WASM.BEGINNERS", создана пользователем vg, 23 май 2008.

  1. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Функция EraseDir удаляет указанную папку.
    Если у файла(папки) установлен атрибут FILE_ATTRIBUTE_READONLY - функция должна убирать этот атрибут.
    Но иногда попадаются такие папки, в которые функция не может "зайти" - функция определяет эти папки как файлы. Видимо дело в атрибутах?
    Вопрос:как правильно изменить любые атрибуты папки, чтобы у неё остался один - FILE_ATTRIBUTE_DIRECTORY ?

    Код (Text):
    1. EraseDir proc directory:DWORD
    2.      LOCAL searchfilter[MAX_PATH]:BYTE
    3.      LOCAL filepath[MAX_PATH]:BYTE
    4.      LOCAL predir[MAX_PATH]:BYTE
    5.      LOCAL hfind:DWORD
    6.      LOCAL wfd:WIN32_FIND_DATA
    7.  
    8. jmp @F
    9. pathanymask db "\*",0
    10. updirmask   db "..",0
    11. curdirmask  db ".",0
    12. slash       db "\",0
    13. @@:
    14.     invoke lstrcpy,addr searchfilter,directory
    15.     invoke lstrcat,addr searchfilter,addr pathanymask
    16.     invoke FindFirstFile,addr searchfilter,addr wfd
    17.     .if eax!=INVALID_HANDLE_VALUE
    18.         mov hfind,eax
    19.         .while eax!=0
    20.             invoke lstrcpy,addr filepath,directory
    21.             invoke lstrcat,addr filepath,addr slash
    22.             invoke lstrcat,addr filepath,addr wfd.cFileName
    23.             invoke GetFileAttributes,addr filepath
    24.             .if eax==FILE_ATTRIBUTE_READONLY
    25.                 and    eax,NOT FILE_ATTRIBUTE_READONLY
    26.                 invoke SetFileAttributes,addr filepath,eax
    27.             .endif
    28.             .if wfd.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY
    29.                 invoke lstrcmp,addr wfd.cFileName,addr updirmask
    30.                 .if eax!=0
    31.                     invoke lstrcmp,addr wfd.cFileName,addr curdirmask
    32.                     .if eax!=0
    33.                         invoke EraseDir,addr filepath
    34.                     .endif
    35.                 .endif
    36.             .else
    37.                 invoke DeleteFile,addr filepath
    38.             .endif
    39.             invoke FindNextFile,hfind,addr wfd
    40.         .endw
    41.         invoke FindClose,hfind
    42.     .endif
    43.      invoke RemoveDirectory,directory
    44.      ret
    45. EraseDir endp
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Неверная проверка атрибутов. Наличие атрибута означает выставленный флаг (бит) в двойном слове атрибутов. Соответственно, чтобы проверить наличие атрибута, нужно проверять не на равенство всего слова какому-либо значению, а на наличие соответствующего бита. Например, если побитовое "и" (операция test) с соответствующей маской (которой в свою очередь и является соответствующая константа типа FILE_ATTRIBUTE_READONLY или FILE_ATTRIBUTE_DIRECTORY) дает ненулевой результат, то бит, выставленный в маске, выставлен также и в проверяемом двойном слове атрибутов.
     
  3. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    в дополнение к ответу l_inc:
    в твоём коде замени == на & там, где требуется операция test
    например:
    Код (Text):
    1. .If eax&FILE_ATTRIBUTE_READONLY
    2. ...