获得一个目录下的文件名 *.exe

本文介绍了一个使用MASM32编写的文件搜索程序示例,该程序能够递归地搜索指定路径下的所有目标文件,并统计文件数量。通过分析路径、文件属性等来实现对指定扩展名文件的有效检索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   ;#Mode=CON

   .386
   .model flat, stdcall
   option casemap :none

   include windows.inc
   include user32.inc
   include kernel32.inc
   include masm32.inc

   includelib user32.lib
   includelib kernel32.lib
   includelib masm32.lib
   include macro.asm
   .data
      szStartPath   db   'c:/windows',0
      szFilter      db   '*.exe',0
      szEnter      db   10,13,0     
   .data?
      buffer      db 100 dup(?)
      dwCounter   dd   ?
   .CODE
   ProcessFile   proc
         ret
   ProcessFile Endp

   FindFile   proc   lpszPath
         local   stFindFile:WIN32_FIND_DATA
         local   hFindFile
         ;MAX_PATH在Windows.inc中有定义=260,注意大小写
         local   szPath[MAX_PATH]     :byte   ;当前要搜索的路径
         local   szSearch[MAX_PATH]  :byte   ;当前要搜索的路径/*.dll
         local   szFindFile[MAX_PATH]:byte   ;路径/找到的文件
        
         pushad
         invoke   lstrcpy,addr szPath,lpszPath   ;生成当前要搜索的路径
         invoke   lstrlen,addr szPath
         lea      esi,szPath
         add      esi,eax         ;指向 szPath 中最后一个字符
         xor      eax,eax
         mov      al,'/'
         .if   BYTE ptr [esi-1] != al  ;判断最后一个字符的前一个字符是否为 /
                  mov   word ptr [esi],ax  ;不是,补全 szPath的形式就是 db 'xxxx/',0
         .endif        
         invoke   lstrcpy,addr   szSearch,addr   szPath   ;复制到 szSearch
         invoke   lstrcat,addr   szSearch,addr   szFilter ;szSearch 的形式就是 db 'xxxx/*.dll',0
         invoke   FindFirstFile,addr   szSearch,addr   stFindFile
         .if      eax != INVALID_HANDLE_VALUE  ; INVALID_HANDLE_VALUE 错误的句柄!无法创建这个文件
               mov   hFindFile,eax                     ;保存查找的handle
               .repeat
         invoke   lstrcpy,addr   szFindFile,addr   szPath ;因为找到的文件是不带路径                                    ;所以,结果上要补全路径
         invoke   lstrcat,addr   szFindFile,addr   stFindFile.cFileName  ;加上找到的文件名
               .if      stFindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY      ;找到的是目录
                  .if   stFindFile.cFileName != '.'         ;如果找到的目录不是"."
                  invoke FindFile,addr   szFindFile      ;递归,进入这个目录
               .endif
               .else      ;找到的不是目录,就是文件
                  inc    dwCounter               ;文件计数器加一
                  invoke StdOut,addr   szFindFile      ;输出文件名
                  invoke StdOut,addr   szEnter
               .endif
                  ;继续在这个目录中查找
                  invoke   FindNextFile,hFindFile,addr   stFindFile             
               .until   (eax==FALSE)      ;直到找不到满足条件的文件
                 invoke   FindClose,hFindFile
         .endif       
         popad
         ret
   FindFile   endp

   START:
      mov      dwCounter,0
      invoke   FindFile,addr   szStartPath         ;起始路径
      invoke   wsprintf,addr buffer,CTXT("%s %d %s"),CTXT('一共找到'),dwCounter,CTXT('个文件')
      invoke    StdOut,addr buffer
     
      ;暂停显示,回车键关闭
      invoke StdIn,addr buffer,sizeof buffer
      invoke ExitProcess,0
     
   end START

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值