FindNextFile и вложенные директории

Тема в разделе "WASM.BEGINNERS", создана пользователем tagegor, 24 сен 2009.

  1. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    Здравствуйте. Помогите реализовать сканер директорий:
    Использую FindFirstFile и FindNextFile...
    Но при использовании данной функции вложенная папка воспринимается как файл... Это мне не подходит :)
    Что я имею:
    Код (Text):
    1.     Invoke FindFirstFile, Addr mytestpath, Addr wfd
    2.     .If Eax == INVALID_HANDLE_VALUE
    3.         Invoke MessageBoxA, NULL, 0, 0, MB_ICONERROR
    4.         Invoke ExitProcess, 0
    5.     .EndIf
    6.     Mov hFind, Eax
    7.  
    8.  
    9. @@:
    10. Invoke FindNextFile, hFind, Addr wfd
    11. .If Eax != 0
    12.     Invoke lstrcmp, Addr wfd.cFileName, Addr dot
    13.     .If Eax != 0
    14.         Invoke lstrcmp, Addr wfd.cFileName, Addr ddot
    15.         .If Eax != 0
    16.             Invoke MessageBoxA, NULL, Addr wfd.cFileName, 0, MB_OK
    17.         .EndIf
    18.     .EndIf
    19.     Jmp @B
    20. .EndIf
    Как реализовать "вхождение" сканера в субдиректории?!
     
  2. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    По совету поставил
    Вместо
    Код (Text):
    1.     mytestpath DB 'C:\www\*', 0
    Поставить
    Код (Text):
    1.     mytestpath DB 'C:\www\*.*', 0
    Всеравно не срабатывает :dntknw:
     
  3. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    WIN32_FIND_DATA.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
     
  4. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    \masm32\examples\exampl06\listview
     
  5. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    o14189
    +1 и добавляю. А рекурсивно папки просканировать слабо?
     
  6. VaZoNeZ

    VaZoNeZ New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    121
    В нэте валяется исходник рекурсивного поиска на масме. Посмотри там.
     
  7. IceT

    IceT IceT

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    233
    Адрес:
    RU
    Код (Text):
    1. fScanFiles proc  uses EBX ECX EDX EDI, sCurDir:DWORD,sMask:DWORD,hOutList:DWORD
    2.  
    3. mySTACK struct
    4.         h1  dd 00h
    5.         h2  dd 00h
    6.         h3  dd 00h
    7.         h4  dd 00h
    8.         h5  dd 00h
    9.         h6  dd 00h
    10.         h7  dd 00h
    11.         h8  dd 00h
    12.         h9  dd 00h
    13.         h10 dd 00h
    14.         h11 dd 00h
    15.         h12 dd 00h
    16. mySTACK ends
    17.  
    18. LOCAL sFName    :DWORD
    19. LOCAL cWFD      :WIN32_FIND_DATA
    20. LOCAL hFile     :DWORD
    21. LOCAL cStack    :mySTACK
    22. LOCAL iDirLong  :DWORD
    23. LOCAL iMaskLong :DWORD
    24.  
    25. .data ?
    26.  sSrStr byte ?
    27.  
    28. .code
    29.  
    30. invoke lstrlen,sCurDir
    31. push   EAX
    32. pop    iDirLong
    33.  
    34. invoke lstrlen,sMask
    35. push   EAX
    36. pop    iMaskLong
    37.  
    38. lea    ESI,sCurDir
    39. lea    EDI,sSrStr
    40. movsb
    41.  
    42. mov    EDI, -4
    43.  
    44. lFirst:
    45.   invoke FindFirstFile,sCurDir,addr cWFD                    ;поиск первого файла в дир-ии
    46.   push   EAX                                                ;через стек
    47.   pop    hFile                                              ;сохраняем хендл полученного файла
    48.   cmp    hFile,INVALID_HANDLE_VALUE                         ;если нет ошибки
    49.   jne    lCheck                                             ;то обрабатываем полученный файл
    50.   jmp    lErrorExit
    51.  
    52. lCheck:
    53.   lea    EAX, cWFD.cFileName                                ;в EAX указатель на имя файла    
    54.   cmp    byte ptr [EAX], '.'                                ;если первый байт имени файла = ".",
    55.   je     lFindNext                                          ;то ищем следующий файл
    56.   mov    sFName,EAX                                         ;иначе покажем  
    57.   invoke SendMessage,hOutList,LB_ADDSTRING,0,sFname         ;имя файла в ListBox
    58.  
    59.   cmp    cWFD.dwFileAttributes, FILE_ATTRIBUTE_DIRECTORY    ;найденный файл - директория?
    60.   jne    lValidPE                                           ;если нет, то проверим PE он или нет
    61.                                                             ;если же дир-ия, то необходимо сформировать новый путь для поиска
    62.     mov    EBX, [sCurDir]                                   ;в EBX указатель на строку с директорией
    63.     invoke lstrlen, EBX                                     ;выясняем ее длину
    64.     mov    byte ptr [EBX+EAX]-3, 00h                        ;сокращаем строку на 3, т.о. избавляемся от '*.*'
    65.     lea    EAX, cWFD.cFileName                              ;в EAX указатель на имя файла
    66.     invoke lstrcat, EBX,EAX                                 ;сцепляем sCurDir с именем поддиректории
    67.     invoke lstrlen, EBX                                     ;выясняем новую длину строки с дир-ей
    68.     mov    dword ptr [EBX+EAX], '*.*\'                      ;добавляем '\*.*' в конец пути
    69.     mov    byte  ptr [EBX+EAX+4], 00h                       ;и признак конца строки
    70.                                                             ;новая директория для поиска сформирована
    71.                                                             ;сохранение хендла текущего файла
    72.       lea    EDX, cStack                                    ;в EDX указатель на структуру
    73.       add    EDI, 04h                                       ;увеличиваем указатель "нашего" стека
    74.       push   hFile                                          ;через стек
    75.       pop    [EDX+EDI]                                      ;сохраняем хендл в наш специальную структуру-фрейм
    76.       jmp    lFirst                                         ;новый поиск в новой директории
    77.  
    78. lFindNext:                                                  ;поиск следующего файла
    79.   invoke FindNextFile, hFile, addr cWFD                     ;ф-ия поиска с пар-ми: хендл текущего файла и структура WIN32_FIND_DATA
    80.   test   EAX,EAX                                            ;или если ф-ия завалилась                                        
    81.   je     lexitFindNext                                      ;то на метку обработки ошибок
    82.   jmp    lCheck                                             ;иначе прыжок на обработку нового файла  
    83.  
    84. lexitFindNext:
    85.   invoke GetLastError                                       ;возвращает статус последней ошибки в EAX
    86.   cmp    EAX, ERROR_NO_MORE_FILES                           ;если файлов в папке больше нет
    87.   je     lReturn                                            ;то на метку возврата в пред. дир-ию или завершения, если некуда возвращатся
    88.   cmp    EAX, INVALID_HANDLE_VALUE                          ;или если ф-ия вернула "плохой" хендл
    89.   je     lFindNext                                          ;то ищем дальше
    90.   jmp    lErrorExit                                         ;в остальных случаях выходим с ошибкой
    91.  
    92. lValidPE:                                                   ;
    93.   ;is valid PE file                                         ;
    94.   jmp lFindNext                                             ;продолжаем поиск
    95.  
    96. lReturn:                                                    ;далее происходит возврат в предыдущуу дир-ию или завершение
    97.   invoke lstrlen, sCurDir                                   ;выясняем - не нашли ли мы последний файл в стартовой дир-ии                      
    98.   cmp    EAX,iDirLong                                       ;путем сравнения длины строки текущей дир-ии и стартовой
    99.   je     Fin                                                ;если да, то прыгаем на завершение
    100.   lea    EDX,cStack                                         ;иначе необходимо восстановить старый хендл
    101.   push   [EDX+EDI]                                          ;из специального фрейма ("нашего" стека)
    102.   pop    hFile                                              ;в переменную hFile
    103.                                                             ;удаление из sCurDir символов до "\" и прибавление "\*.*00"
    104.   mov    EBX, [sCurDir]                                     ;в EBX указатель на строку с дир-ей
    105.   sub    EAX, 4                                             ;последние 4 символа нас не интересуют - отбрасываем их сразу
    106. lSymbCmp:                                                   ;далее идет поиск символа "\"
    107.   dec    EAX                                                ;уменьшаем EAX, т.о. передвигаемся к началу строки
    108.   cmp    byte ptr [EBX+EAX], '\'                            ;сравнение следующего символа строки с символом "\"
    109.   jne    lSymbCmp                                           ;если не равен, то проверяем дальше
    110.   mov dword ptr [EBX+EAX],'*.*\'                            ;добавляем символы фильтра для поиска
    111.   mov byte ptr  [EBX+EAX+4],00h                             ;и признак конца строки
    112.   sub EDI, 04h                                              ;уменьшаем указатель на наш "стек"
    113.   jmp lFindNext                                             ;прыгаем на поиск следующего файл в сформированной дир-ии
    114.  
    115. lErrorExit:
    116.   mov EAX,0
    117.  
    118. Fin:                                                        ;поиск завершен
    119.  
    120. ret                                                         ;возврат
    121.  
    122. fScanFiles endp                                             ;конец функции
    Функа еще хранит хэндлы ( зачем-то же было мне это нужно %) ). Убери лишнее, короче.