Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > Удаление внутренностей папки


Автор: Бор 29.7.2006, 22:20
Здравствуйте! Я заходил уже на ваш форум, мне очень помогли. Огромное спасибо. Но у меня вдальнейшем случалась еще одна проблема.
Ниже размещен код программы, который должен удалить все внутренности папки (C:\abc), но он удаляет в этой папки файлы и внутренности вложенный папкок, а саму папку не удаляет. Прошу помочь найти ошибку. Заранее спасибо.
Код

.386
.model flat,stdcall
option casemap:none
include C:\masm615\include\kernel32.inc
DeleteDirectory PROTO, lpDirectory:PTR BYTE

MAX_PATH                             equ 260

FILETIME STRUCT
  dwLowDateTime     DWORD      ?
  dwHighDateTime    DWORD      ?
FILETIME ENDS


WIN32_FIND_DATA STRUCT
  dwFileAttributes      DWORD      ?
  ftCreationTime        FILETIME <>
  ftLastAccessTime      FILETIME <>
  ftLastWriteTime       FILETIME <>
  nFileSizeHigh         DWORD      ?
  nFileSizeLow          DWORD      ?
  dwReserved0           DWORD      ?
  dwReserved1           DWORD      ?
  cFileName             BYTE MAX_PATH dup(?)
  cAlternate            BYTE 14 dup(?)
WIN32_FIND_DATA ENDS

.data
adress BYTE "C:\abc",0

file_attr WIN32_FIND_DATA <>
fName BYTE "*.*",0
.code
main PROC
invoke DeleteDirectory,ADDR adress
invoke ExitProcess,0
main ENDP


DeleteDirectory PROC, lpDirectory: PTR BYTE

LOCAL CurrentDir[60]:BYTE, findHandle:DWORD,cDir[20]:BYTE

invoke SetCurrentDirectory, [lpDirectory]
invoke GetCurrentDirectory,60,ADDR CurrentDir
invoke FindFirstFile,ADDR fName, ADDR file_attr

mov findHandle,eax
 
invoke FindNextFile,findHandle,ADDR file_attr
cmp eax,0
jz exit 



poisk:
invoke FindNextFile,findHandle,ADDR file_attr
cmp eax,0
jz exit 
mov eax,file_attr.dwFileAttributes
cmp eax,10h
jnz ne_papka
lea esi, file_attr.cFileName
lea edi, cDir
mov ecx, 20
cld
rep movsb

invoke DeleteDirectory,ADDR file_attr.cFileName
invoke SetCurrentDirectory, ADDR CurrentDir


lea edi, file_attr.cFileName
lea esi, cDir
mov ecx, 20
cld
rep movsb


invoke RemoveDirectory, ADDR file_attr.cFileName 
jmp poisk
ne_papka:
invoke DeleteFile, ADDR file_attr.cFileName
lea esi,file_attr.cFileName
mov eax,0
mov ecx,5
Zap_null:
mov [esi],eax
add esi,4
Loop Zap_null

jmp poisk
exit:
ret 
DeleteDirectory ENDP
end main
 

Автор: Damarus 30.8.2006, 20:02
Бор, для простого удаления директории слишком заумно. Так проще:
Код

; @echo off
; goto make

.386
.model flat,stdcall

option casemap:none

SHFileOperationA PROTO :DWORD
ExitProcess PROTO :DWORD

includelib shell32.lib
includelib kernel32.lib

SHFILEOPSTRUCTA STRUCT
    hwnd                    DWORD   ?
    wFunc                   DWORD   ?
    pFrom                   DWORD   ?
    pTo                     DWORD   ?
    fFlags                  WORD    ?
    fAnyOperationsAborted   DWORD   ?
    hNameMappings           DWORD   ?
    lpszProgressTitle       DWORD   ?
SHFILEOPSTRUCTA ENDS

.const
FOF_NOCONFIRMATION   equ   0010h
FOF_NOCONFIRMMKDIR   equ   0200h
FOF_NOERRORUI        equ   0400h
FOF_SILENT           equ   0004h
FO_DELETE            equ   0003h

.data
Path db 'C:\abc',0

.code
main proc
    LOCAL FileOperation:SHFILEOPSTRUCTA
    
    mov FileOperation.hwnd, 0
    mov FileOperation.wFunc, FO_DELETE
    mov FileOperation.pFrom, OFFSET Path
    mov FileOperation.pTo, 0
    mov FileOperation.fFlags, FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR or \
        FOF_NOERRORUI or FOF_SILENT
    mov FileOperation.fAnyOperationsAborted, 0
    mov FileOperation.hNameMappings, 0
    mov FileOperation.lpszProgressTitle, 0
    invoke SHFileOperationA, ADDR FileOperation
    
    invoke ExitProcess, 0
main endp
end main

; :make
; ml /c /coff Bor.cmd
; link /LIBPATH:"D:\Microsoft Visual Studio 8\VC\PlatformSDK\Lib" /MACHINE:X86 /SUBSYSTEM:CONSOLE Bor.obj
; pause

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)