查找文件并把他保存为文件列表。求writefile用法
程序代码:
;练习。。。。。。。。。。。。 ;by onepc 153785587 ; .386 .model flat,stdcall option casemap:none include windows.inc ;include gdi32.inc ;includelib gdi32.lib include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include comdlg32.inc includelib comdlg32.lib include macro.asm ;这个是CTXT("") 宏 IDD_DIALOG1 equ 100 IDC_BUTTON1 equ 1000 IDC_EDIT1 equ 1001 IDC_BUTTON2 equ 1002 IDC_STATIC equ 1003 .data szFilter db 'Text Files(*.txt)',0,'*.txt',0,'All Files(*.*)',0,'*.*',0,0 szBfind db 'find',0 szBstop db 'stop',0 szd db '.',0 szdd db '..',0 ;szFexe db '*.exe',0 ;查找exe文件 szFexe db '*.*',0 ;查找exe文件 szEnter db 0dh,0ah,0 szLogfile db 'onepc.log',0 ;记录文件 .data? hInstance dd ? ;实例句柄其 实就是装入内存的基址 hMin dd ? ;对话框句柄 szPath db MAX_PATH dup(?) ;文件路径缓冲区 szFpath db MAX_PATH dup(?) ;查找路径 g:这种结尾 hFile dd ? ;打开文件句柄 szFpname db MAX_PATH dup(?) ;程序的自身全路径 szFppath db MAX_PATH dup(?) ;程序所在的目录 .code ;打开文件 _openfile proc local @stFile:OPENFILENAME invoke RtlZeroMemory,addr @stFile,sizeof @stFile ;填零 mov @stFile.lStructSize,sizeof @stFile push hMin pop @stFile.hwndOwner ;mov @stFile.hwndOwner,hMin mov @stFile.lpstrFilter,offset szFilter mov @stFile.lpstrFile,offset szPath mov @stFile.nMaxFile,MAX_PATH mov @stFile.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST invoke GetOpenFileName,addr @stFile .if eax ;getopenfilename打开成功的话返回非0值 invoke MessageBox,NULL,addr szPath,addr szPath,MB_OK .endif ret _openfile endp ;; 程序的路径 _propath proc push esi ;保存esi invoke GetModuleFileName,hInstance,addr szFpname,MAX_PATH ;这里得到的程序路径在第二个参数 ;invoke MessageBox,NULL,addr szFpname,CTXT("path"),0 mov esi,offset szFpname ;mov 里不能用addr invoke lstrlen,addr szFpname ;计算长度 add esi,eax ;esi指向szFpname的第一个字符的地址,esi=esi+eax 这时esi指向路径的最后一个字符地址 mov al,'\' .while TRUE .break .if byte ptr [esi-1]==al ;esi指向的位置一遇到\就退出循环 dec esi .endw xor eax,eax ;把eax置0 ,听说比mov 的速度快 xor 可以看成 not and mov word ptr [esi],ax ;esi-1 esi 置0 esi-1,及后一个字节为0 这样别的api函数就会戴断。得到所需的 ;invoke MessageBox,NULL,addr szFpname,CTXT("path"),0 invoke lstrcpy,addr szFppath,addr szFpname ;把带\的路径传给szFppath invoke lstrcat,addr szFppath,addr szLogfile ;在程序目录下将要生成的文件onepc.log ;invoke MessageBox,NULL,addr szFppath,CTXT("path"),0 pop esi ret _propath endp ;; ;;创建记录文件 _clog proc call _propath ;得出路径 invoke CreateFile,addr szFppath,GENERIC_WRITE,FILE_SHARE_READ,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0 ;CREATE_ALWAYS 创建新文件,如果文件已经存在则清除原文件。 .if eax!=INVALID_HANDLE_VALUE ;失败的话返回INVALID_HANDLE_VALUE 成功返回一个文件句柄 mov hFile,eax ;把句柄传给hFile .endif ret _clog endp ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;查找文件 _findfile proc _lppath ;参数 指向路径 \ ;_findfile addr szFpath local @hFfile local @stData:WIN32_FIND_DATA local @szPath[MAX_PATH]:BYTE ;用来存放“路径\” local @szSearch[MAX_PATH]:BYTE ;用来存放“路径\*.*” local @szFindFile[MAX_PATH]:BYTE ;用来存放“路径\找到的文件” local @checkd,@checkdd ;检测变量 local @szWbuffer[MAX_PATH]:BYTE ; 缓冲区 包含 要写入文件的数据 local @dwNum ;保存写入文件中的实际字节数 pushad invoke lstrcpy,addr @szPath,_lppath ;存放路径\ ;; 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 szFexe ;这时@szSearch存的是路径\*.exe ;; invoke FindFirstFile,addr @szSearch,addr @stData .if eax !=INVALID_HANDLE_VALUE ;找到了会返回一个文件句柄,-1表示失败 mov @hFfile,eax .repeat ;找到处理 invoke lstrcpy,addr @szFindFile,addr @szPath invoke lstrcat,addr @szFindFile,addr @stData.cFileName ; @stData.cFileName这个是找到的文件名,不带路径 ; ;invoke lstrcmp ;参数类型 ;int lstrcmp( ; LPCTSTR lpString1, // pointer to first string ; LPCTSTR lpString2 // pointer to second string ; ); ;int strcmp( const char *string1, const char *string2 ); ; .if @stData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ;invoke lstrcmp,@stData.cFileName,'.' ;mov @checkd,eax ;cmp @checkd,0 ;jz @f ;invoke lstrcmp,@stData.cFileName,'..' ;mov @checkdd,eax ;cmp @checkdd,0 ;jz @f invoke lstrcmp,addr @stData.cFileName,addr szd mov @checkd,eax invoke lstrcmp,addr @stData.cFileName,addr szdd mov @checkdd,eax .if @checkd && @checkdd invoke _findfile,addr @szFindFile .endif ; .if @stData.cFileName != '.' ; invoke _findfile,addr @szFindFile ; .endif .else ;invoke MessageBox,NULL,addr @szFindFile,CTXT("Find-File"),0 ;这里显示文件 ;invoke SendDlgItemMessage,hMin,IDC_STATIC,WM_SETTEXT,0,addr @szFindFile ;invoke _savefile,addr @szFindFile ;保存文件名 invoke RtlZeroMemory,addr @szWbuffer,sizeof @szWbuffer ; invoke lstrcat,addr @szWbuffer,addr @szFindFile invoke lstrcat,addr @szWbuffer,addr szEnter invoke WriteFile,hFile,addr @szWbuffer,MAX_PATH,addr @dwNum,0 ;得出的格式不是我想的 .endif ; invoke FindNextFile,@hFfile,addr @stData .until eax==FALSE invoke FindClose,@hFfile ;关闭文件句柄 invoke FindClose,hFile .endif popad ret _findfile endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DlgProc proc uses esi edi ebx hDlg,uMsg,wParam,lParam .if uMsg==WM_INITDIALOG push hDlg pop hMin ;invoke LoadIcon,hInstance,IDR_MAINFRAME ;invoke SendMessage,hDlg,WM_SETICON,ICON_BIG,eax invoke SendDlgItemMessage,hDlg,IDC_EDIT1,WM_SETTEXT,0,CTXT("G:\af") invoke GetDlgItemText,hDlg,IDC_EDIT1,addr szFpath,sizeof szFpath .elseif uMsg==WM_COMMAND mov eax,wParam .if ax==IDC_BUTTON1 call _openfile call _propath .endif .if ax==IDC_BUTTON2 invoke GetDlgItemText,hDlg,IDC_EDIT1,addr szFpath,sizeof szFpath ;取得路径 call _clog invoke _findfile,addr szFpath .endif .elseif uMsg==WM_CLOSE invoke EndDialog,hDlg,FALSE .else mov eax,FALSE ret .endif mov eax,TRUE ret DlgProc endp start: invoke GetModuleHandle,NULL mov hInstance,eax invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL invoke ExitProcess,NULL end start
程序代码:
// Generated by ResEdit 1.4.7 // Copyright (C) 2006-2009 // http://www. "resource.h" #define IDD_DIALOG1 100 #define IDC_BUTTON1 1000 #define IDC_EDIT1 1001 #define IDC_BUTTON2 1002 #define IDC_STATIC 1003 // // Dialog resources // //LANGUAGE 4, SUBLANG_SYS_DEFAULT IDD_DIALOG1 DIALOG 0, 0, 186, 95 //STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_FIXEDSYS | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU STYLE DS_MODALFRAME | WS_POPUP | DS_CENTER | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "FindFile ASM + API" FONT 8, "Ms Shell Dlg 2" { PUSHBUTTON "Open", IDC_BUTTON1, 41, 36, 36, 14 EDITTEXT IDC_EDIT1, 16, 15, 163, 14, ES_AUTOHSCROLL DEFPUSHBUTTON "Find", IDC_BUTTON2, 90, 36, 34, 14 LTEXT "", IDC_STATIC, 15, 65, 160, 11, SS_LEFT }