поиск директорий с заданными именами

Тема в разделе "WASM.BEGINNERS", создана пользователем rewo, 2 окт 2006.

Статус темы:
Закрыта.
  1. rewo

    rewo New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2006
    Сообщения:
    14
    Здравствуйте
    помгите пожалуйста советом .
    Мне нужна функция поиска директорий по заданным названием на всех дисках компа.
    Как это можно реализовать?

    за примеры огромное спасибо :)
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    FindFirstFile/FindNextFile, за примерами в доку
     
  3. rewo

    rewo New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2006
    Сообщения:
    14
    >censored
    спасибо, подскажи в какой ман заглянуть?
     
  4. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    msdn
     
  5. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    слово их 4х букв (не х** :)
     
  6. rewo

    rewo New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2006
    Сообщения:
    14
    очень даже хочу
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    чего ты хочешь? слово из 4х букв?
     
  8. rewo

    rewo New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2006
    Сообщения:
    14
    подскажи в какой ман заглянуть?

    msdn

    слово их 4х букв (не х** :) (подразумевается не хочу, хотя каждый мыслит в меру своей испорченности)

    отсюда ответ "хочу", то есть хочу посмотреть этот мануал

    дошло?
     
  9. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Код (Text):
    1. format PE GUI 4.0                      ; PE EXE файл
    2. entry start                        ; Точка входа
    3.  
    4.   include 'include\win32a.inc'
    5.  
    6. section '.main' code readable writeable executable     ; Секция кода
    7.                                ; и данных
    8.  
    9.       buf     rb 500h                      ; Буффер для имени директории
    10.  
    11.       fake1   dd '.',0                     ; Дирекории, которые
    12.       fake2   dd '..',0                    ; НЕ надо сканировать
    13.  
    14.  
    15.   start:                           ; Начало основной
    16.                                ; Программы
    17.  
    18.       push    1h                       ; SEM_FAILCRITICALERRORS
    19.       call    [SetErrorMode]                   ; Установим error mode
    20.                                ; что бы в случае обращения
    21.                                ; к недоступному диску
    22.                                ; не вываливалось сообщение
    23.  
    24.  
    25.       call    [GetLogicalDrives]               ; Получаем список дисков,
    26.                                ; существующих в системе
    27.  
    28.       mov     ecx,25                       ; Будем проверять, начиная с Z:\
    29.  
    30.     .find_drives:
    31.       mov     ebx,1                    ; Нехитрые опрерации в
    32.       shl     ebx,cl                       ; ходе которых мы выясняем
    33.       and     ebx,eax                      ; присутствует диск в
    34.       je      .no_disk                     ; системе или нет
    35.  
    36. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    37. ; На всякий случай, пояснение из MSDN:
    38. ;
    39. ; ;---------------------------------;
    40. ; ;  DWORD GetLogicalDrives(void);  ;
    41. ; ;---------------------------------;
    42. ;
    43. ; Return Values:
    44. ; --------------
    45. ;     If the function succeeds, the return value is a bitmask
    46. ;     representing the currently available disk drives.
    47. ;     Bit position 0 (the least-significant bit) is drive A,
    48. ;     bit position 1 is drive B, bit position 2 is drive C, and so on.
    49. ;
    50. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    51.  
    52.       add     cl,65                    ; Если да, то добавим
    53.       mov     byte [buf],cl                ; букву диска в
    54.       sub     cl,65                    ; буффер
    55.  
    56.       mov     dword [buf+1],':\*.'             ; Сформируем строку
    57.       mov     byte [buf+5],'*'                 ; для поиска, вида,
    58.       mov     byte [buf+6],0                   ; например, C:\*.*
    59.  
    60.       push    eax                      ; Сохраняем в стеке
    61.       push    ecx                      ; нужные регистры
    62.  
    63.       call    find_files                   ; Вызываем процедуру поиска
    64.  
    65.       pop     ecx                      ; Восстанавливаем
    66.       pop     eax                      ; регистры
    67.  
    68.     .no_disk:                          ; Если диска нет,
    69.       dec     ecx                      ; то проверяем следующий
    70.       jge     .find_drives                 ; пока ecx>0
    71.  
    72.       push    0                        ; Выходим из
    73.       call    [ExitProcess]                ; программы
    74.  
    75.      fd     WIN32_FIND_DATA               ; структура WIN32_FIND_DATA
    76.       find_h dd ?
    77.   proc find_files                      ; Рекурсивная процедура
    78.                                ; поиска файлов
    79.  
    80.                                ; Локальные переменные:
    81.                       ; и хэндл поиска
    82.  
    83.                           ; Вход в процедуру
    84.  
    85.       lea    eax,[fd]                      ; Вычисляем и кладем в стек
    86.       push   eax                       ; указатель на стуктуру find data
    87.       push   buf                       ; Указатель на имя директории, где искать
    88.       call   [FindFirstFile]                   ; Ищем
    89.       inc    eax                       ; Если ничего
    90.       je     .exit                     ; не нашли - выходим
    91.       dec    eax                       ; Иначе, сохраним
    92.       mov    [find_h],eax                  ; хэндл поиска
    93.  
    94.     .find_next:
    95.       mov    eax,[fd.dwFileAttributes]             ; Проверяем, нашли
    96.       and    eax,FILE_ATTRIBUTE_DIRECTORY          ; директорию?
    97.       je     .found                    ; Если нет - прыгаем на .found
    98.  
    99.       lea    eax,[fd.cFileName]                ; Проверяем,
    100.       push   eax                       ; вдруг это
    101.       push   fake1                     ; "."
    102.       call   [lstrcmp]                     ;
    103.       test   eax,eax                       ; Если да,
    104.       je     .next                     ; ищем следующий файл
    105.  
    106.       lea    eax,[fd.cFileName]                ; Проверяем,
    107.       push   eax                       ; вдруг это
    108.       push   fake2                     ; ".."
    109.       call   [lstrcmp]                     ;
    110.       test   eax,eax                       ; Если да
    111.       je     .next                     ; ищем следующий файл
    112.  
    113.       push   buf                       ; Вычислим
    114.       call   [lstrlen]                     ; длину строки
    115.       sub    eax,3                     ; вычтем *.*
    116.       push   eax                       ; сохраним полученную длину
    117.  
    118.       mov    byte [buf+eax],0                  ; Если мы всё-таки
    119.       lea    eax,[fd.cFileName]                ; нашли директорию
    120.       push   eax                       ; то прибавляем
    121.       push   buf                       ; её имя к текущей
    122.       call   [lstrcat]                     ; папке
    123.  
    124.       push   buf                       ; Опять вычислим
    125.       call   [lstrlen]                     ; длину получившейся строки
    126.  
    127.       mov    dword [buf+eax],'\*.*'            ; и прибавим
    128.       mov    byte [buf+eax+4],0                ; \*.* для поиска
    129.  
    130.       call   find_files                    ; Вызываем процедуру
    131.                                ; поиска для найденной
    132.                                ; директории
    133.  
    134.       pop    eax                       ; Восстановим
    135.       mov    dword [buf+eax-1],'\*.*'              ; имя прежней
    136.       mov    byte [buf+eax+3],0                ; директории
    137.  
    138.       jmp    .next                     ; Ищем следующий файл
    139.  
    140.     .found:
    141.  
    142.       lea    eax,[fd.cFileName]
    143.       push   eax
    144.       call   [lstrlen]
    145.       cmp    dword [fd.cFileName+eax-4],'.txt'         ; Проверим расширение файла
    146.       jne    .next                     ; Если не совпадает ищем дальше
    147.  
    148.       lea    eax,[fd.cFileName]
    149.       push   0                         ;
    150.       push   eax                       ;
    151.       push   eax                       ;
    152.       push   0                         ; Покажем MessageBox с
    153.       call   [MessageBox]                  ; именем найденного файла
    154.  
    155.     .next:
    156.       lea    eax,[fd]                      ; Кладем в стек указатель
    157.       push   eax                       ; на структуру find_data
    158.       push   [find_h]                      ; Хэндл текущего поиска
    159.       call   [FindNextFile]                ; Ищем следующий файл
    160.       test   eax,eax                       ;
    161.       jne    .find_next                    ; Если ничего не нашли,
    162.  
    163.       push   [find_h]                      ; то закрываем
    164.       call   [FindClose]                   ; хэндл поиска
    165.  
    166.     .exit:                         ;
    167.       return                           ; Выход
    168.   endp
    169.  
    170. data import                        ; Импорт нужных API-функций
    171.  
    172.   library kernel32,'KERNEL32.DLL',\
    173.       user32,'USER32.DLL'
    174.  
    175.   include 'include\APIA\kernel32.inc'
    176.   include 'include\APIA\user32.inc'
    177.  
    178. end data
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    > fake1 dd '.',0
    как всё запущенно.. Тем более, товарищу поиск папки нужен был.

    rewo
    Смотри MSDN и поиск по форуму тоже - был пример.
     
Статус темы:
Закрыта.