Рекурсивный поиск папок и файлов...

Тема в разделе "WASM.ASSEMBLER", создана пользователем MAPTbIH, 3 янв 2006.

  1. MAPTbIH

    MAPTbIH Member

    Публикаций:
    0
    Регистрация:
    3 янв 2006
    Сообщения:
    84
    Товарищи, мне требуется осуществить рекурсивный поиск папок

    (пока без файлов). Можете ли вы положить здесь исходный код

    (на языке ассемблера, разумеется) с использованием функций Win API FindFirstFile, FindNextFile, FindClose. На Delphi я сделал это вот так:

    ;========================================================

    procedure SearchDir(Dir: string);

    var

    FD: _WIN32_FIND_DATAA;

    FH: THandle;

    begin

    FH:=FindFirstFile(PChar(Dir+'*'),FD);

    if FH <> INVALID_HANDLE_VALUE then

    repeat

    if Ord(FD.cFileName[0])<>46 then

    if (FD.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY) then

    begin

    SearchDir(Dir+Fd.cFileName+'\');

    end;

    until Windows.FindNextFile(FH,FD) = False;

    end;

    ;=========================================================

    А на ассемблер перевести пока не получилось. Заранее благодарен за сотрудничество.
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Компилишь, смотришь ассемблерный код (в IDA, например), выкидываешь ненужное, получаешь результат (грубо, конечно, но это - основные этапы). Оптимизируешь, если сможешь после компилятора...
     
  3. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Лови:
    Код (Text):
    1.  
    2. buf db MAX_PATH dup(?)  ; <--- Путь папки
    3.  
    4. Find proc StartFolder:DWORD
    5. LOCAL search: WIN32_FIND_DATA
    6. LOCAL directory[MAX_PATH]: BYTE
    7. LOCAL hFind:DWORD
    8.     invoke  GetPathOnly, StartFolder, addr directory    ; Получаем стартовый каталог (функция из пакета masm32)
    9.     invoke  FindFirstFile, StartFolder, addr search     ; Ищем первый файл
    10.     mov     hFind, eax
    11.     lf:
    12.     test    search.dwFileAttributes, 10h            ; Каталог ли это?
    13.     je  lf2
    14.     cmp byte ptr[search.cFileName], "."     ; Каталоги "." и ".." нам нафиг не нужны
    15.     je  lf2
    16.     invoke  RtlZeroMemory, offset buf, MAX_PATH     ; Забиваем нулями переменную buf функцией RtlZeroMemory (kernel32.dll)
    17.     invoke  lstrcpy, offset buf, addr directory
    18.     invoke  lstrcat, offset buf, addr search.cFileName  ; Составляем строку пути каталога
    19.     invoke  lstrlen, offset buf
    20.     mov byte ptr[buf][eax], 05Ch            ; Добавляем "\" (все эти извращения сделаны ради большей скорости)
    21.    
    22.  
    23.     invoke  MessageBox,0,offset buf,0,0         ; <-- Показываем путь каталога
    24.  
    25.  
    26.     invoke  lstrcpy, offset buf, addr directory
    27.     invoke  lstrcat, offset buf, addr search.cFileName  ; Составим строку пути каталога с маской
    28.     invoke  lstrlen, offset buf
    29.     mov byte ptr[buf][eax], 05Ch            ; Добавим "\"
    30.     mov byte ptr[buf][eax+1], 02Ah          ; Добавим "*"
    31.     invoke  Find, offset buf                ; Рекурсия
    32.     lf2:   
    33.     invoke  FindNextFile, hFind, addr search
    34.     cmp eax, 0
    35.     jnz lf
    36.     invoke  FindClose, hFind
    37.     ret
    38. Find endp


    Вот. Не пинайте сильно.

    P.S. Вызов: invoke Find, $CTA0("C:\*")
     
  4. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    кроме "." и ".." могут быть каталоги, которые просто начинаются на точку.

    ==========

    я делал так:
    Код (Text):
    1.  
    2.     ...
    3.     mov eax,dword [.fdata.cFileName]
    4.     and eax,0FFFFFFh
    5.     cmp eax,".."
    6.     je @F ; типа пропускаем
    7.     cmp ax,"."
    8.     je @F
    9.     ...
    10.