Рекурсив

Тема в разделе "WASM.BEGINNERS", создана пользователем KLERIK, 31 авг 2006.

  1. KLERIK

    KLERIK New Member

    Публикаций:
    0
    Регистрация:
    12 авг 2006
    Сообщения:
    20
    Необходимо получить содержимое папки и её подпапках.
    Как организовать рекурсию???
    fasm.
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    scan_dir(dir) {
    foreach (file in dir) {
    if (file.attr==DIRECTORY && file.name!="." && file.name!="..") {
    scan_dir(file);
    } else {
    process_file(file);
    }
    }
    }
    можно мне еще пива? %)
     
  3. clone

    clone New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2006
    Сообщения:
    84
    Ключевые слова -- recursive FindFirstFile FindNextFile FindClose
    Перечисляешь файлы, для файлов с аттрибутом FILE_ATTRIBUTE_DIRECTORY вызываешь ф-цию перечисления рекурсивно.
    Проще, конечно, найти примеры на C/C++, на ASM перевести не должно быть проблемой.
     
  4. KLERIK

    KLERIK New Member

    Публикаций:
    0
    Регистрация:
    12 авг 2006
    Сообщения:
    20
    Спасибо, поиск рулит:)
     
  5. Crazy_Death

    Crazy_Death New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    16
    Код (Text):
    1. #include <stdio.h> 
    2. #include <string.h>
    3. #include <windows.h>   
    4. #include <conio.h> 
    5. #include <iostream.h>  
    6. #include <vcl.h>   
    7. #include <fcntl.h> 
    8. #include <io.h>
    9. void FindDir(char* path,char* mask)
    10. {  
    11. WIN32_FIND_DATA wfd;   
    12. HANDLE hfound; 
    13. char newpath[MAX_PATH];
    14. char fpath[MAX_PATH];  
    15. strcpy(fpath,path);//Copies one string to another.
    16. strcat(fpath,"\\");//Appends one string to another.
    17. strcat(fpath,mask);
    18.     if((hfound=FindFirstFile(fpath,&wfd))!=INVALID_HANDLE_VALUE)   
    19.     {//Compares two strings to determine if they are the same. The comparison is case-sensitive.   
    20.         if(!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,"."))  
    21.         {  
    22.             //значит нашли первый файл в папке path и делаем что-нибудь 
    23.             //fpath                  - здесь думаю разбересся ;)   
    24.             //wfd.cFileName    - здесь тем более ))   
    25.         }  
    26.         while(FindNextFile(hfound,&wfd))   
    27.         {  
    28.             if(!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,"."))  
    29.             {  
    30.                 //значит нашли первый файл в папке path и делаем что-нибудь 
    31.                 //fpath                  - здесь думаю разбересся ;)   
    32.                 //wfd.cFileName    - здесь тем более ))   
    33.             }  
    34.         }  
    35.     }  
    36. FindClose(hfound);//поиск файлов закончили, теперь ищем подпапки 
    37. strcpy(fpath,path);
    38. strcat(fpath,"\\*.*"); 
    39.     if((hfound=FindFirstFile(fpath,&wfd))!=INVALID_HANDLE_VALUE)   
    40.     {  
    41.         if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,"."))   
    42.         {  
    43.             strcpy(newpath,path);  
    44.             strcat(newpath,"\\");  
    45.             strcat(newpath,wfd.cFileName); 
    46.             FindDir(newpath,mask); //ЭТО НАЗЫВАЕТСЯ "РЕКУРСИЯ"
    47.         }  
    48.         while(FindNextFile(hfound,&wfd))   
    49.         {  
    50.             if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,"."))   
    51.             {  
    52.                 strcpy(newpath,path);  
    53.                 strcat(newpath,"\\");  
    54.                 strcat(newpath,wfd.cFileName); 
    55.                 FindDir(newpath,mask); //ЭТО НАЗЫВАЕТСЯ "РЕКУРСИЯ"
    56.             }  
    57.         }  
    58.     }
    59. }
    60.  
    61. WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    62. {  
    63.     FindDir("C:","*.");
    64.      return 0; 
    65. }  
    66. //---------------------------------------------------------------------------
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Crazy_Death
    Мутный код.
     
  7. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    Вот для вывода всех подключей HKEY_CURRENT_USER
    думаю для файлов переделать не сложно
    Код (Text):
    1. IMAGE_BASE      = 400000h
    2. HKEY_CLASSES_ROOT   = 80000000h
    3. HKEY_CURRENT_USER   = 80000001h
    4. HKEY_LOCAL_MACHINE  = 80000002h
    5.  
    6.  
    7. format PE CONSOLE at IMAGE_BASE
    8. include 'win32a.inc'
    9.  
    10. section '.code' code readable executable
    11.     invoke GetStdHandle, STD_OUTPUT_HANDLE
    12.     mov [hOutput], eax
    13.     push eax
    14.     stdcall print, szHK, 0
    15.     invoke RegOpenKey, HKEY_LOCAL_MACHINE, szHard, hSubKey
    16.     test eax, eax
    17.     jnz @F
    18.     stdcall PrintKeys, [hSubKey], 1
    19. @@: call [CloseHandle]
    20.     ret
    21.    
    22. proc PrintKeys hKey, nLevel
    23.     pushad
    24.     xor esi, esi
    25. @@: invoke RegEnumKey, [hKey], esi, lpName, 256
    26.     test eax, eax
    27.     jnz @F
    28.     inc esi
    29.     stdcall print, lpName, [nLevel]
    30.     invoke RegOpenKey, [hKey], lpName, hSubKey
    31.     test eax, eax
    32.     jnz @B
    33.     mov eax, [nLevel]
    34.     inc eax
    35.     stdcall PrintKeys, [hSubKey], eax
    36.     jmp @B
    37. @@: invoke RegCloseKey, [hKey]
    38.     popad
    39.     ret
    40. endp
    41.  
    42. proc print lpString, nLevel
    43.     pushad
    44.     mov edi, szTabs
    45.     mov eax, 020202020h
    46.     mov ecx, [nLevel]
    47.     mov edx, ecx
    48.     rep stosd
    49.     shl edx, 2
    50.     invoke WriteFile, [hOutput], szTabs, edx, nWriten, 0
    51.     invoke lstrlen, [lpString]
    52.     invoke WriteFile, [hOutput], [lpString], eax, nWriten, 0
    53.     invoke WriteFile, [hOutput], szCRLF, 2, nWriten, 0
    54.     popad
    55.     ret
    56. endp
     
  8. Crazy_Death

    Crazy_Death New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    16
    IceStudent
    а в чем именно мутность заключаеться?

    давно на ishodniki.ru скачал, вполне рабочий код
     
  9. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Crazy_Death
    а в чем именно мутность заключаеться?
    1) автор не знает о существовании конструкции do ... while;
    2) при перечислении файлов нет необходимости сравнивать имя с "." и "..";
    3) после перебора каталогов отсутствует FindClose;
    4) нет необходимости на каждой итерации резервировать в стеке 2 * MAX_PATH + sizeof (WIN32_FIND_DATA).

    PS если код не собственный, то справедливо постить ссылку, а не сам код, если страницы с кодом больше нет, то указывать автора, а то получается, что _ты_ написал не вполне хороший вариант.
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Crazy_Death
    То, что у q_q плюс зачем отдельно вызывать поиск каталогов и файлов?
     
  11. Crazy_Death

    Crazy_Death New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    16
    типа я помню автора
    q_q спасиба
     
  12. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    IceStudent
    зачем отдельно вызывать поиск каталогов и файлов?
    Потому что в этом варианте можно искать файлы по маске и не все подкаталоги могут ей соответствовать.
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    q_q
    А.. Понятно. Ну тогда уж маску проще написать через "\\*".