WIN32汇编语言教程:第10章 内存管理和文件操作 · 10.2 文件操作(7)

include           kernel32.inc
includelib        kernel32.lib
include           ole32.inc
includelib        ole32.lib
include           shell32.inc
includelib        shell32.lib
;####################################################################
; Equ 等值定义
;####################################################################
ICO_MAIN              equ       1000
DLG_MAIN              equ       100
IDC_PATH              equ       101
IDC_BROWSE        equ       102
IDC_NOWFILE        equ       103
;####################################################################
; 数据段
;####################################################################
                      .data?
hInstance         dd    ?
hWinMain              dd    ?
dwFileSizeHigh    dd    ?
dwFileSizeLow     dd    ?
dwFileCount        dd    ?
dwFolderCount     dd    ?
szPath            db    MAX_PATH dup (?)
dwOption              db    ?
F_SEARCHING        equ    0001h
F_STOP            equ    0002h
                      .const
szStart            db     '开始(&S)',0
szStop             db     '停止(&S)',0
szFilter              db    '*.*',0
szSearchInfo           db     '共找到 %d 个文件夹,%d 个文件,共 %luK 字节',0
;####################################################################
; 代码段
;####################################################################
                      .code
include           _BrowseFolder.asm
;####################################################################
; 处理找到的文件
;####################################################################
_ProcessFile          proc   _lpszFile
                      local  @hFile
 
                      inc    dwFileCount
                      invoke SetDlgItemText,hWinMain,IDC_NOWFILE,_lpszFile
                           invoke  CreateFile,_lpszFile,GENERIC_READ,FILE_SHARE_READ,0,\
                             OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
                      .if    eax != INVALID_HANDLE_VALUE
                              mov    @hFile,eax
                              invoke GetFileSize,eax,NULL
                              add    dwFileSizeLow,eax
                              adc    dwFileSizeHigh,0
                              invoke CloseHandle,@hFile
                      .endif
                      ret
 
_ProcessFile          endp
;####################################################################
_FindFile         proc      _lpszPath
                      local  @stFindFile:WIN32_FIND_DATA
                      local  @hFindFile
                       local  @szPath[MAX_PATH]:byte ;用来存放“路径\”
                       local  @szSearch[MAX_PATH]:byte;用来存放“路径\*.*”
                       local  @szFindFile[MAX_PATH]:byte;用来存放“路径\找到的文件”
 
                      pushad
                      invoke lstrcpy,addr @szPath,_lpszPath
;********************************************************************
; 在路径后面加上\*.*
;********************************************************************
                      @@:
                      invoke lstrlen,addr @szPath
                      lea    esi,@szPath
                      add    esi,eax
                      xor    eax,eax
                      mov    al,'\'
                      .if    byte ptr [esi-1] != al
                              mov    word ptr [esi],ax
                      .endif
                      invoke lstrcpy,addr @szSearch,addr @szPath
                      invoke lstrcat,addr @szSearch,addr szFilter
;********************************************************************
; 寻找文件
;********************************************************************
invoke    FindFirstFile,addr @szSearch,addr @stFindFile
.if        eax != INVALID_HANDLE_VALUE
              mov    @hFindFile,eax
              .repeat
                      invoke lstrcpy,addr @szFindFile,addr @szPath
                     invoke  lstrcat,addr @szFindFile,addr @stFindFile.cFileName
                      .if    @stFindFile.dwFileAttributes \
                             & FILE_ATTRIBUTE_DIRECTORY
                              .if    @stFindFile.cFileName != '.'
                                      inc    dwFolderCount
                                      invoke _FindFile,addr @szFindFile
                              .endif
                      .else
                              invoke _ProcessFile,addr @szFindFile
                      .endif
                      invoke FindNextFile,@hFindFile,addr @stFindFile
          .until (eax == FALSE) || (dwOption & F_STOP)
          invoke FindClose,@hFindFile
.endif
;********************************************************************
                  popad
                  ret
 
_FindFile     endp
;####################################################################
_ProcThread    proc   uses ebx ecx edx esi edi,lParam
                  local  @szBuffer[256]:byte
 
;********************************************************************
; 设置标志,并灰化“浏览”按钮和路径输入栏
;********************************************************************
                  and    dwOption,not F_STOP
                  or    dwOption,F_SEARCHING
                  invoke GetDlgItem,hWinMain,IDC_PATH
                  invoke EnableWindow,eax,FALSE
                  invoke GetDlgItem,hWinMain,IDC_BROWSE
                  invoke EnableWindow,eax,FALSE
                  invoke SetDlgItemText,hWinMain,IDOK,addr szStop
                  xor    eax,eax
                  mov    dwFileSizeHigh,eax
                  mov    dwFileSizeLow,eax
                  mov    dwFileCount,eax
                  mov    dwFolderCount,eax
 
                  invoke _FindFile,addr szPath
;********************************************************************
; 退出时显示找到文件的总长度

上页:第10章 内存管理和文件操作 · 10.2 文件操作(6) 下页:第10章 内存管理和文件操作 · 10.2 文件操作(8)

第10章 内存管理和文件操作

版权所有 © 中山市飞娥软件工作室 证书:粤ICP备09170368号