| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1882 人关注过本帖
标题:查找文件并把他保存为文件列表。求writefile用法
只看楼主 加入收藏
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
结帖率:54.55%
收藏
已结贴  问题点数:20 回复次数:7 
查找文件并把他保存为文件列表。求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
}


搜索更多相关主题的帖子: 保存 文件 用法 列表 writefile 
2009-09-25 11:31
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
收藏
得分:0 
程序代码:
G:\af\520.txt 
                                                                                                                                                                                                                                                     G:\af\a.txt 
                                                                                                                                                                                                                                                       G:\af\aa.bat 
                                                                                                                                                                                                                                                      G:\af\dfaa.bat 
                                                                                                                                                                                                                                                    G:\af\y.txt 
                                                                                                                                                                                                                                                       G:\af\复件 (2) a.txt 
                                                                                                                                                                                                                                              G:\af\复件 (3) a.txt 
                                                                                                                                                                                                                                              G:\af\复件 (4) a.txt 
                                                                                                                                                                                                                                              G:\af\复件 (5) a.txt 
                                                                                                                                                                                                                                              G:\af\复件 (6) a.txt 
                                                                                                                                                                                                                                              G:\af\复件 (7) a.txt 
                                                                                                                                                                                                                                              G:\af\复件 (8) a.txt 
                                                                                                                                                                                                                                              G:\af\复件 a.txt 
                                                                                                                                                                                                                                                  G:\af\新建 Microsoft Excel 工作表.xls 
                                                                                                                                                                                                                             G:\af\新建 Microsoft PowerPoint 演示文稿.ppt 
                                                                                                                                                                                                                      G:\af\新建 文本文档.txt 
                                                                                                                                                                                                                                           G:\af\新建文件夹 (2)\复件 (2) a.txt 
                                                                                                                                                                                                                               G:\af\新建文件夹 (2)\复件 (3) a.txt 
                                                                                                                                                                                                                               G:\af\新建文件夹 (2)\复件 (4) a.txt 
                                                                                                                                                                                                                               G:\af\新建文件夹 (2)\复件 (5) a.txt 
                                                                                                                                                                                                                               G:\af\新建文件夹 (2)\复件 a.txt 
                                                                                                                                                                                                                                   
会这样的。。。。是否加回车换行那里有问题?
2009-09-25 11:32
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
收藏
得分:0 
对了在那个指定需要输入的字数那里。
用sizeof 也是不行。

怎么样才能把那多余的空格去掉。刚好写入是一个路径
2009-09-25 13:14
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
收藏
得分:0 
可能是把一个绶冲区写满然后再用writefile写入。可能这样就没那和多空格了。试下
2009-09-25 13:25
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
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 ;得出的格式不是我想的
//这里用@szWbuffer纯属多余

==============================================
invoke    lstrcat,addr @szFindFile,addr @stData.cFileName ; @stData.cFileName这个是找到的文件名,不带路径  //这里已获得全路径名

invoke lstrlen,addr @szFindFile
mov ecx,eax
invoke WriteFile,hFile,addr @szFindFile ,ecx,addr @dwNum,0

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-09-26 14:56
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:20 
如果想用真正意义上的缓冲区来缓冲大量写入数据,减小硬盘磨损。应该在‘堆’上分配内存池。而不是在‘栈’上,因为栈空间有限,尤其在这种递归调用

下很容易被耗空。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-09-26 15:03
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
收藏
得分:0 
我的原意还要在文件名后加上他的创建时间之类的是否隐藏。所以用一个变量。保存。
2009-09-26 15:51
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
啊,没见你那个变量的格式化输出啊?

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-09-26 16:08
快速回复:查找文件并把他保存为文件列表。求writefile用法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039430 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved