Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [masm32]Удаление подкатолога со всем содержимым 
:(
    Опции темы
Shadowlord
Дата 11.5.2010, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 28.11.2006

Репутация: нет
Всего: 5



Собственно  есть задание
Код

Вывести список файлов и подкаталогов в заданной директории, удалить первый найденный подкаталог вместе со всем содержимым предварительно запросив подтверждение у пользователя
 

Засел не посредственно на удаление, что то не могу сообразить как его сделать , вот то что есть 
Код

.386
.model flat,stdcall
option casemap:none

;П О Д К Л Ю Ч А Е М     Ф А Й Л Ы

      include c:\MASM32\INCLUDE\windows.inc
      include c:\MASM32\INCLUDE\masm32.inc
      include c:\MASM32\INCLUDE\gdi32.inc
      include c:\MASM32\INCLUDE\user32.inc
      include c:\MASM32\INCLUDE\kernel32.inc
      include c:\MASM32\INCLUDE\Comctl32.inc
      include c:\MASM32\INCLUDE\comdlg32.inc
      include c:\MASM32\INCLUDE\shell32.inc
      include c:\MASM32\include\ole32.inc

;П О Д К Л Ю Ч А Е М      Б И Б Л И О Т Е К И

      includelib c:\MASM32\LIB\masm32.lib
      includelib c:\MASM32\LIB\gdi32.lib
      includelib c:\MASM32\LIB\user32.lib
      includelib c:\MASM32\LIB\kernel32.lib
      includelib c:\MASM32\LIB\Comctl32.lib
      includelib c:\MASM32\LIB\comdlg32.lib
      includelib c:\MASM32\LIB\shell32.lib
      includelib c:\MASM32\LIB\ole32.lib
      
;М А К Р О С Ы

szText MACRO Name, Text:VARARG
    LOCAL lbl
    jmp lbl
    Name db Text,0
    lbl:
ENDM

return MACRO arg
    mov eax,arg
    ret
ENDM

;П Р О Т О Т И П Ы

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
ListBox proto :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ListBoxProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
PushButton PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
EditSl PROTO  :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
EdProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
Static PROTO  :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
Find PROTO
Delete PROTO

;Д А Н Н Ы Е

.data
;данные окна
hInstance HINSTANCE ?
CommandLine LPSTR ?
hIcon    dd    0
lpLstBox dd 0
lpfnEdProc dd 0
btnClass  db "BUTTON",0
ClassName db "MyClass",0
AppName  db "777",0
TheText db "Вы действительно хотите удалить подкатолог?",0
Thetitle db "???",0
Begin db "START",0
OpenBtn db "...",0
SDir db "Выбор каталога",0
Year db "2010",0
Month db "12",0
Day db "30",0
BS db "\",0
Coma db ".",0
Coma2 db "..",0
TypeFiles db "*",0
;данные для работы
flag dd 0
count dd 0
buf db 255 dup(0)
buf1 db 255 dup(0)
CurDir db 255 dup (0)

what1 db 255 dup(0)
what2 db 255 dup(0)

hButton1 dd 0
hButton2 dd 0
hEdit dd 0
hList dd 0
dialogh db "777",0



;О С Н О В Н О Й   М О Д У Л Ь    

.code
start:
    invoke GetModuleHandle, NULL
    mov    hInstance,eax
    invoke GetCommandLine
    mov    CommandLine,eax
    invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
    invoke ExitProcess,eax
    
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    LOCAL wc:WNDCLASSEX
    LOCAL msg:MSG
    LOCAL hwnd:HWND
    invoke LoadIcon,hInst,500    ; icon ID
    mov hIcon, eax
    mov   wc.cbSize,SIZEOF WNDCLASSEX
    mov   wc.style, CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
    mov   wc.lpfnWndProc, OFFSET WndProc
    mov   wc.cbClsExtra,NULL
    mov   wc.cbWndExtra,NULL
    push  hInstance
    pop   wc.hInstance
    mov   wc.hbrBackground,COLOR_WINDOW
    mov   wc.lpszMenuName,NULL
    mov   wc.lpszClassName,OFFSET ClassName
    push  hIcon
    pop   wc.hIcon
    push  hIcon
    pop   wc.hIconSm
    invoke LoadCursor,NULL,IDC_ARROW
    mov   wc.hCursor,eax
    invoke RegisterClassEx, addr wc
    INVOKE CreateWindowEx, WS_EX_OVERLAPPEDWINDOW,ADDR ClassName,ADDR AppName,\
                WS_OVERLAPPED or WS_SYSMENU,50,50,600,430,NULL,NULL,hInst,NULL
    mov   hwnd,eax
    invoke LoadMenu,hInst,600  ; menu ID
    invoke SetMenu,hwnd,eax
    invoke ShowWindow, hwnd,SW_SHOWNORMAL
    invoke UpdateWindow, hwnd
    .WHILE TRUE
        invoke GetMessage, ADDR msg,NULL,0,0
        .BREAK .IF (!eax)
        invoke TranslateMessage, ADDR msg
        invoke DispatchMessage, ADDR msg
    .ENDW
    mov     eax,msg.wParam
    ret
WinMain endp

;О К О Н Н А Я    Ф У Н К Ц И Я

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    LOCAL tmp: DWORD
        
    .IF uMsg==WM_DESTROY
        invoke PostQuitMessage,NULL
        
    .ELSEIF uMsg == WM_CREATE
        szText lbl1,"Файлы: "
        invoke Static,ADDR lbl1,hWnd,260,125,110,17,0  ;260,120,110,17,0 
          
        ;листбокс для содержимого каталога первого файла
        invoke ListBox,20,150,550,200,hWnd,500                ;20,250,550,100,hWnd,500
        mov hList, eax 
        invoke SetWindowLong,hList,GWL_WNDPROC,ListBoxProc
        mov lpLstBox, eax
        ;поле выбора
        invoke GetCurrentDirectory, 255, ADDR CurDir
        invoke EditSl,ADDR CurDir,20,20,300,25,hWnd,200
        mov hEdit, eax    
        invoke SetWindowLong,hEdit,GWL_WNDPROC,EdProc
        mov lpfnEdProc, eax
        ;кнопка для работы
        invoke PushButton,ADDR Begin,hWnd,20,60,350,25,501
        mov hButton1, eax
        ;кнопка для выбора каталога
        invoke PushButton,ADDR OpenBtn,hWnd,320,20,50,25,1000
        mov hButton2, eax
        
    .ELSEIF uMsg==WM_COMMAND
    
        .IF wParam == 1000                                                                      ; "Выбрать каталог"
            invoke lstrcpyA, ADDR buf, ADDR CurDir
            invoke BrowseForFolder,hWnd,ADDR buf,ADDR SDir,0
            .IF buf[0] != 0
                invoke SetCurrentDirectory,ADDR buf
                invoke lstrcpyA, ADDR CurDir, ADDR buf
                invoke SetWindowText,hEdit,ADDR CurDir
            .ENDIF
            
        .ELSEIF wParam == 1200                                                                ; "Выход"
             invoke SendMessage,hWnd,WM_SYSCOMMAND,SC_CLOSE,NULL
                .ELSEIF wParam == 501                                                    ; "Поехали"
                                                                        
Next:                invoke SendMessage,hList,LB_GETCOUNT,0,0
                    cmp eax,0
                    je AfterClear
                    Clear: invoke SendMessage,hList,LB_DELETESTRING,0,0
                    jmp Next
AfterClear:        mov flag,1
                    invoke Find
                    .IF (flag == 0)
                        invoke MessageBox,hWnd,ADDR TheText,ADDR Thetitle,MB_YESNO
                        .IF (eax==IDYES)
                                invoke Delete
                        .endif
                        
                    .ENDIF
        .ENDIF        
    .ENDIF
    invoke DefWindowProc,hWnd,uMsg,wParam,lParam
    ret
WndProc endp 

ListBox proc a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,hParent:DWORD,ID:DWORD
    szText lstBox,"LISTBOX"
    invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR lstBox,0,
        WS_VSCROLL or WS_VISIBLE or \
        WS_BORDER or WS_CHILD or \
        LBS_HASSTRINGS or LBS_NOINTEGRALHEIGHT or \
        LBS_DISABLENOSCROLL,
        a,b,wd,ht,hParent,ID,hInstance,NULL
    ret
ListBox endp
;процедура листбокса
ListBoxProc proc hCtl   :DWORD,
                 uMsg   :DWORD,
                 wParam :DWORD,
                 lParam :DWORD
    LOCAL IndexItem  :DWORD
    LOCAL Buffer[32] :BYTE
    .if uMsg == WM_LBUTTONDBLCLK
        jmp DoIt
    .elseif uMsg == WM_CHAR
        .if wParam == 13
            jmp DoIt
        .endif
    .endif
    jmp EndDo
    DoIt:
    invoke SendMessage,hCtl,LB_GETCURSEL,0,0
    mov IndexItem, eax
    invoke SendMessage,hCtl,LB_GETTEXT,IndexItem,ADDR Buffer
    EndDo:
    invoke CallWindowProc,lpLstBox,hCtl,uMsg,wParam,lParam
    ret
ListBoxProc endp
;процедура кнопки
PushButton proc lpText:DWORD,hParent:DWORD,a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD
    invoke CreateWindowEx,0,
        ADDR btnClass,lpText,
        WS_CHILD or WS_VISIBLE,
        a,b,wd,ht,hParent,ID,
        hInstance,NULL
    ret
PushButton endp
;процедура текстбокса
EditSl proc szMsg:DWORD,a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,hParent:DWORD,ID:DWORD
    szText slEdit,"EDIT"
    invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR slEdit,szMsg,
        WS_VISIBLE or WS_CHILDWINDOW or \
        ES_AUTOHSCROLL or ES_NOHIDESEL,
        a,b,wd,ht,hParent,ID,hInstance,NULL
    ret
EditSl endp
EdProc proc hCtl   :DWORD,
             uMsg   :DWORD,
             wParam :DWORD,
             lParam :DWORD
    invoke CallWindowProc,lpfnEdProc,hCtl,uMsg,wParam,lParam
    ret
EdProc endp
;процедура надписи
Static proc lpText:DWORD,hParent:DWORD,
                 a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD

    LOCAL hndle:DWORD

    szText statClass,"STATIC"

    invoke CreateWindowEx,WS_EX_LEFT,
            ADDR statClass,lpText,
            WS_CHILD or WS_VISIBLE or SS_LEFT,
            a,b,wd,ht,hParent,ID,
            hInstance,NULL
    ret
Static endp



;Р А Б О Т А Е М    

Find proc
    LOCAL hFind: HANDLE
    LOCAL FileFindData: WIN32_FIND_DATA
    LOCAL now[256]: BYTE
    LOCAL next[256]:BYTE
  
    invoke FindFirstFile,ADDR TypeFiles ,ADDR FileFindData                        
    mov hFind,eax
    .IF hFind != INVALID_HANDLE_VALUE
        mov eax,1
        .WHILE eax != 0    
            invoke lstrcmp, ADDR FileFindData.cFileName, ADDR Coma
            .IF eax !=0 
                invoke lstrcmp, ADDR FileFindData.cFileName, ADDR Coma2
                .IF eax !=0 
                    .IF FileFindData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY            
                        .IF flag==1
                            invoke GetCurrentDirectory,255,ADDR what1
                            invoke lstrcpyA, ADDR what2, ADDR FileFindData.cFileName
                            mov flag,0
                        .ENDIF
                        invoke GetCurrentDirectory,255,ADDR next
                        invoke lstrcpyA, ADDR now, ADDR next
                        invoke lstrcatA, ADDR next, ADDR BS
                        invoke lstrcatA, ADDR next, ADDR FileFindData.cFileName
                        invoke SendMessage,hList,LB_ADDSTRING,0,ADDR next
                        invoke SetCurrentDirectory, ADDR next
                        invoke Find
                        invoke SetCurrentDirectory, ADDR now
                    .ENDIF
                .ENDIF
            .ENDIF
        invoke FindNextFile,hFind,ADDR FileFindData
        .ENDW        
        invoke FindClose,hFind
    .ENDIF    
    return 0
Find endp

Delete proc
    

    return 0
Delete endp

end start

PM MAIL   Вверх
Shadowlord
Дата 12.5.2010, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 28.11.2006

Репутация: нет
Всего: 5



Разобрался вроде как удалять папку если в ней нет вложенных подкаталогов, а вот рекурсивно удалить все внутренности не получается
Код

Delete proc
    LOCAL hFind: HANDLE
    LOCAL FileFindData: WIN32_FIND_DATA
    invoke SetCurrentDirectory,ADDR what1
    invoke GetCurrentDirectory,255,ADDR CurDir
    

    invoke FindFirstFile,ADDR TypeFiles,ADDR FileFindData
    mov hFind,eax

    .IF hFind != INVALID_HANDLE_VALUE
        mov eax,1
        .WHILE eax != 0
            invoke lstrcmp, ADDR FileFindData.cFileName, ADDR Coma
            .IF eax !=0 
                invoke lstrcmp, ADDR FileFindData.cFileName, ADDR Coma2
                .IF eax !=0 
                    invoke lstrcpyA, ADDR CurDir, ADDR what2
                    invoke lstrcatA, ADDR CurDir, ADDR BS
                    invoke lstrcatA, ADDR CurDir, ADDR FileFindData.cFileName
                    invoke DeleteFile ,ADDR CurDir
                .ENDIF
            .ENDIF
            invoke FindNextFile,hFind,ADDR FileFindData        
        .ENDW
    .ENDIF
    invoke FindClose,hFind    
    
    invoke SetCurrentDirectory,ADDR what1
    invoke RemoveDirectory , ADDR what2
    return 0

Delete endp
  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Windows/DOS"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Windows/Dos | Следующая тема »


 




[ Время генерации скрипта: 0.4644 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.