首页
社区
课程
招聘
[求助]求一个关于复制操作的代码
发表于: 2007-8-6 08:17 16782

[求助]求一个关于复制操作的代码

2007-8-6 08:17
16782
.386
                .model flat, stdcall
                option casemap :none
               
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib

                .data?

lpBuffer        dd        ?
lpDir                dd        128 dup (?)
lpDirBuffer        dd        128 dup (?)
lpFileName        dd        128 dup (?)
                .const
lpStr        db        'test',0
lpXie        db        '\',0
szYear         db         '%s',   0   
lpFile1        db        'FormatText.exe',0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;获得当前目录与文件名
                invoke GetCurrentDirectory,100,addr lpDir
                invoke GetModuleFileName,NULL,addr lpFileName,100
;回显一下               
                invoke        wsprintf,addr lpBuffer,addr szYear,addr lpFileName
                invoke        MessageBox,NULL,addr lpBuffer,addr lpStr,MB_OK
;获得系统目录并串联上文件名               
                invoke        GetSystemDirectory,addr lpDir,100
                invoke        lstrcat,addr lpDirBuffer,addr lpDir
                invoke        lstrcat,addr lpDirBuffer,addr lpXie
                invoke        lstrcat,addr lpDirBuffer,addr lpFile1
;回显一下               
                invoke        wsprintf,addr lpBuffer,addr szYear,addr lpDirBuffer
                invoke        MessageBox,NULL,addr lpBuffer,addr lpStr,MB_OK
;当前文件复制到系统目录               
                invoke CopyFile,addr lpFileName,lpDirBuffer,FALSE
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>               

关于复制的代码,试了回显下路径与文件名都是对的。但就是没法复制成功。很郁闷!求各位大大帮忙看看

[课程]Linux pwn 探索篇!

收藏
免费 7
支持
分享
最新回复 (43)
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
希望得到各位帮助
2007-8-6 09:53
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
顶一下。我是新手,请不要冷落我。HELP~~~~~~~~~~
2007-8-8 16:00
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
4
invoke CopyFile,addr lpFileName,addr lpDirBuffer,FALSE
2007-8-8 21:54
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
哦天呢,好愚蠢的错误~~~~~~
2007-8-8 22:16
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
再问下,如果我想复制D盘所有文件到E盘。该如何做?
2007-8-9 08:56
0
雪    币: 179
活跃值: (131)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
7
递归,一个个复制
2007-8-9 12:58
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
有没有现成做好掉的代码给我鉴戒学习?

递归遍历与复制的思路N人跟我提过了,我也懂。就是代码实现起来对我的水平有难度
2007-8-9 14:49
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
9
在你的代码框架的基础上,把不必要的内容删掉
.386
    .model flat, stdcall
    option casemap :none
    
include    windows.inc
include    user32.inc
includelib  user32.lib
include    kernel32.inc
includelib  kernel32.lib


    .data?

lpBuffer  dd  ?
lpDir    dd  128 dup (?)
lpDirBuffer  dd  128 dup (?)
lpFileName  dd  128 dup (?)

    .const
lpStr  db  'test',0
lpXie  db  '\',0
szYear         db         '%s',   0   
lpFile1  db  'FormatText.exe',0
szFile db '*.*',0
szD db 'D:\',0
.code
_FindFile proc  _lpszPath
	LOCAL @stFindFile:WIN32_FIND_DATA
	LOCAL @szPath[MAX_PATH]:byte
	LOCAL @szSearch[MAX_PATH]:BYTE
	LOCAL @szCopyFile[MAX_PATH]:BYTE
	LOCAL @szFindPath[MAX_PATH]:BYTE
	LOCAL @szCopyPath[MAX_PATH]:BYTE
	LOCAL @hFindFile
	LOCAL @szFindFile[MAX_PATH]:BYTE
	pushad
	invoke lstrcpy,addr @szPath,_lpszPath
	
	invoke lstrlen,addr @szPath
	lea esi,@szPath
                                                                               xor ecx,ecx 
	mov cl,'\'
	.if byte ptr [esi+eax-1]!=cl
		mov word ptr [esi+eax],cx
	.endif
	invoke lstrcpy,addr @szSearch,addr @szPath
	invoke lstrcat,addr @szSearch,addr szFile
	invoke lstrcpy,addr @szCopyPath,addr @szPath
	lea eax,@szCopyPath
	mov byte ptr [eax],'E'
	
	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
		  invoke lstrcpy,addr @szCopyFile,addr @szCopyPath
		  invoke lstrcat,addr @szCopyFile,addr @stFindFile.cFileName
		 
	         .if @stFindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
		  	.if @stFindFile.cFileName!='.'
		  		invoke CreateDirectory,addr @szCopyFile,NULL
		  		invoke _FindFile,addr @szFindFile
		  	.endif
		  .else
		  	 invoke CopyFile,addr @szFindFile,addr @szCopyFile,TRUE
		  .endif
		  invoke FindNextFile,@hFindFile,addr @stFindFile
		 .until eax==FALSE
		 invoke FindClose,@hFindFile
	.endif
	popad
	ret
_FindFile endp
start:
   
    invoke _FindFile,addr szD
    invoke CopyFile,addr lpFileName,addr lpDirBuffer,FALSE
end start 
2007-8-9 20:02
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
盼星星盼月亮,终于盼到有高手愿意为我写这代码了!!!!!
可惜只复制一层目录,子目录下的文件都没被复制。
我回头也去思考下,另外我对你表示强烈的感谢!!!!
2007-8-10 22:31
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
11
不是吧 呵呵 我只是用od调试了两层 没敢运行 你自己试试改改
刚才又调试了一下 发现ecx没有清零的原因
在               lea esi,@szPath
        mov cl,'\'
        .if byte ptr [esi+eax-1]!=cl
前面加上
    xor ecx,ecx
就可以了
2007-8-11 09:41
0
雪    币: 194
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
int SHFileOperation(LPSHFILEOPSTRUCT lpFileOp);
2007-8-11 11:12
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
[QUOTE=bithaha;344377]不是吧 呵呵 我只是用od调试了两层 没敢运行 你自己试试改改
刚才又调试了一下 发现ecx没有清零的原因
在               lea esi,@szPath
        mov cl,'\'
        .if byte ptr [esi+eax-1]!=cl
前面加上
    xor ecx,ecx
就...[/QUOTE]

不行的,还是没有对目录里的进行复制。我觉得是没打开目录的缘故。

我上午写了下注释便于自己理解,然后一直在思考没复制目录内的原因。我把改后代码帖出来,请再帮我改改

.386
.model flat, stdcall
option casemap :none

include    windows.inc
include    user32.inc
includelib  user32.lib
include    kernel32.inc
includelib  kernel32.lib

.data?

.const
szX db '*.*',0
szD db 'D:\',0
.code

_CopyFile proc szFindFile,szCopyFile,hszFindFile
	CreateFile,addr szFindFile,GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
	mov hszFindFile,eax
	invoke CopyFile,hszFindFile,szCopyFile,NULL 
	ret
_CopyFile endp  

_FindFile proc szPath
  LOCAL @hFindFile			;句柄
  LOCAL @stFindFile:WIN32_FIND_DATA	;结构
  LOCAL @szPath[MAX_PATH]:byte		;存放要查找的"路径\"
  LOCAL @szSearch[MAX_PATH]:BYTE	;存放"路径\*.*"
  LOCAL @szFindFile[MAX_PATH]:BYTE	;存放"路径\找到的文件"
  LOCAL @szCopyFile[MAX_PATH]:BYTE	;存放"路径\要复制的文件"
  LOCAL @szCopyPath[MAX_PATH]:BYTE	;要复制的"路径\"

  pushad
  invoke lstrcpy,addr @szPath,szPath	;由参数传入要查找的"路径\"
  invoke lstrlen,addr @szPath		;取"路径"的字符长度
  lea esi,@szPath			;取"路径"的缓冲区首地址
  mov cl,'\'
  xor eax,eax				
  .if byte ptr [esi+eax-1]!=cl		;如果"路径"的缓冲区首地址+长度的末尾一个字符不是"\"
  	mov word ptr [esi+eax],cx	;赋值"\"
  .endif
  invoke lstrcpy,addr @szSearch,addr @szPath	;将要查找的"路径\"赋给原为空的缓冲区
  invoke lstrcat,addr @szSearch,addr szX	;将要查找的"路径\"加上*.*
  invoke lstrcpy,addr @szCopyPath,addr @szPath	;将要查找的"路径\"赋给原为空的缓冲区(要复制的路径)
  lea eax,@szCopyPath				;获取"路径"的缓冲区首地址字符
  mov byte ptr [eax],'C'			;给其更改为C
  
  
  invoke FindFirstFile,addr @szSearch,addr @stFindFile	;参数二:查找的文件字符串;参数三,指向WIN32_FIND_DATA结构缓冲区
  .if eax!=INVALID_HANDLE_VALUE
    mov @hFindFile,eax
    .repeat
      invoke lstrcpy,addr @szFindFile,addr @szPath	;"路径\" 赋值给 原为空的缓冲区
      invoke lstrcat,addr @szFindFile,addr @stFindFile.cFileName	;加上文件名,变成 "路径\找到的文件"
      invoke lstrcpy,addr @szCopyFile,addr @szCopyPath	;"路径\" 赋值给 原为空的缓冲区
      invoke lstrcat,addr @szCopyFile,addr @stFindFile.cFileName	;加上文件名,变成 "路径\要复制的文件"
     
     	.if @stFindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
        .if @stFindFile.cFileName!='.'
          invoke CreateDirectory,addr @szCopyFile,NULL
          invoke _FindFile,addr @szFindFile
        .endif
      .else
         invoke CopyFile,addr @szFindFile,addr @szCopyFile,FALSE
      .endif
      invoke FindNextFile,@hFindFile,addr @stFindFile	;参数二:第一次查找返回的句柄;参数三,指向WIN32_FIND_DATA结构缓冲区
     .until eax==FALSE
     invoke FindClose,@hFindFile
  .endif
  popad
  ret
_FindFile endp
start:
    invoke _FindFile,addr szD
end start 
2007-8-11 12:49
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
14
lea esi,@szPath      ;取"路径"的缓冲区首地址
  mov cl,'\'
  xor eax,eax        
  .if byte ptr [esi+eax-1]!=cl    ;如果"路径"的缓冲区首地址+长度的末尾一个字符不是"\"
    mov word ptr [esi+eax],cx  ;赋值"\"
  .endif
===========
是ecx清0,eax不能清零.
ecx清零是因为放到esi+eax里面的是一个字,这个路径字符串必须要以0字节结束,
eax清零那就完全错误了,eax中保存的是长度.
===============
2007-8-11 13:46
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
[QUOTE=bithaha;344465]lea esi,@szPath      ;取"路径"的缓冲区首地址
  mov cl,'\'
  xor eax,eax        
  .if byte ptr [esi+eax-1]!=cl    ;如果"路径"的缓冲区首地址+长度的末尾一个字...[/QUOTE]

好像可以了。

但我如果改动.const段里的'D:\',0为'D:\VPC\',0为什么就不能成功了?

我想改改.const段就能灵活改变复制的起始目录
2007-8-11 14:02
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
16
我都试过成功了不知道你怎么搞的

你直接改D:\为D:\VPC\当然不可以了,
因为代码中是的目录是直接把C:改成D:的 两个的字符长度必须一样
害得我又试了一下,C盘下一堆垃圾.........  你咋不思考思考再来问呢
2007-8-11 14:18
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
哦,知道了。看来我懂的还不够透彻,感谢你的热心帮助

如果我想D盘内的所有文件放到C:\TEMPDIR下,可以吗?怎样才能实现
2007-8-11 14:26
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
18
是最后一问吗? 只需要加一行代码,修改一行就可以了.
.386
    .model flat, stdcall
    option casemap :none
    
include    windows.inc
include    user32.inc
includelib  user32.lib
include    kernel32.inc
includelib  kernel32.lib


    .data?

lpBuffer  dd  ?
lpDir    dd  128 dup (?)
lpDirBuffer  dd  128 dup (?)
lpFileName  dd  128 dup (?)

    .const
lpStr  db  'test',0
lpXie  db  '\',0
szYear         db         '%s',   0   
lpFile1  db  'FormatText.exe',0
szFile db '*.*',0
szD db 'D:\',0
szC db 'C:\TEMPDIR\',0
.code
_FindFile proc  _lpszPath
	LOCAL @stFindFile:WIN32_FIND_DATA
	LOCAL @szPath[MAX_PATH]:byte
	LOCAL @szSearch[MAX_PATH]:BYTE
	LOCAL @szCopyFile[MAX_PATH]:BYTE
	LOCAL @szFindPath[MAX_PATH]:BYTE
	LOCAL @szCopyPath[MAX_PATH]:BYTE
	LOCAL @hFindFile
	LOCAL @szFindFile[MAX_PATH]:BYTE
	pushad
	invoke lstrcpy,addr @szPath,_lpszPath
	invoke lstrlen,addr @szPath
	xor ecx,ecx
	lea esi,@szPath
	mov cl,'\'
	.if byte ptr [esi+eax-1]!=cl
		mov word ptr [esi+eax],cx
	.endif
	invoke lstrcpy,addr @szSearch,addr @szPath
	invoke lstrcat,addr @szSearch,addr szFile
	[COLOR="Red"]invoke lstrcpy,addr @szCopyPath,addr szC
	invoke lstrcat,addr @szCopyPath,addr @szPath+3[/COLOR]	
              lea eax,@szCopyPath
	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
		  invoke lstrcpy,addr @szCopyFile,addr @szCopyPath
		  invoke lstrcat,addr @szCopyFile,addr @stFindFile.cFileName
		 
	         .if @stFindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
		  	.if @stFindFile.cFileName!='.'
		  		invoke CreateDirectory,addr @szCopyFile,NULL
		  		invoke _FindFile,addr @szFindFile
		  	.endif
		  .else
		  	 invoke CopyFile,addr @szFindFile,addr @szCopyFile,TRUE
		  .endif
		  invoke FindNextFile,@hFindFile,addr @stFindFile
		 .until eax==FALSE
		 invoke FindClose,@hFindFile
	.endif
	popad
	ret
_FindFile endp
start:
   
    invoke _FindFile,addr szD
    invoke CopyFile,addr lpFileName,addr lpDirBuffer,FALSE
end start
2007-8-11 14:56
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
谢谢,可以结帖了!

这真是个相当好的例子,以后我要常常啃它
2007-8-11 15:11
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
怎么运行了不会来
2007-8-11 15:23
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
21
将D盘所有文件都复制到C:\test\。。XP下测试通过,帖子可以结了 :)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
;code by asm   http://www.asm32.cn/
;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib

FUNC MACRO parameters:VARARG
        invoke parameters
        EXITM <eax>
      ENDM
      literal MACRO quoted_text:VARARG
        LOCAL local_text
        .data
          local_text db quoted_text,0
        align 4
        .code
        EXITM <local_text>
      ENDM
      CTXT MACRO quoted_text:VARARG
        EXITM <offset literal(quoted_text)>
      ENDM
    str$ MACRO DDvalue
      LOCAL rvstring
      .data
        rvstring db 20 dup (0)
        align 4
      .code
      invoke dwtoa,DDvalue,ADDR rvstring
      EXITM <ADDR rvstring>
ENDM
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
stMsg MSG <>
buff2 db 256 dup(?)
buff3 db 256 dup(?)
buff4 db 1024 dup(?)
.data
szVol        db 'C',0
szX        db '*.*',0
szM        db ':\',0
szXie        db '\',0
szWindows db 'C:\test\',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_FindFile    proc   _lpszPath
        local    @stFindFile:WIN32_FIND_DATA
        local    @hFindFile
        local    @szPath[MAX_PATH]:byte        ;用来存放“路径\”
        local    @szSearch[MAX_PATH]:byte    ;用来存放“路径\*.*”
        local    @szFindFile[1025]:byte    ;用来存放“路径\找到的文件”
        local hWnd
        pushad
        invoke RtlZeroMemory,addr @szPath,sizeof @szPath
        invoke RtlZeroMemory,addr @szSearch,sizeof @szSearch
        invoke    lstrcpy,addr @szPath,_lpszPath
;********************************************************************
; 在路径后面加上\*.*
;********************************************************************
        @@:
        invoke    lstrlen,addr @szPath
        lea    ebx,@szPath
        add    ebx,eax
        xor    eax,eax
        mov    al,'\'
        .if    byte ptr [ebx-1] != al
            mov    word ptr [ebx],ax
        .endif
        invoke    lstrcpy,addr @szSearch,addr @szPath
        invoke    lstrcat,addr @szSearch,CTXT("*.*")
;********************************************************************
; 寻找文件
;********************************************************************
        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 != '.'
                  invoke RtlZeroMemory,addr buff2,sizeof buff2;清空内存
                  pushad
                  invoke lstrlen,addr @szFindFile ;计算目录的长度
                  sub eax,0
                  lea esi,@szFindFile ;取目录的字符
                  lea edi,buff2
                  add esi,2 ;去掉前2字节字符,然后才开始合并成新路径
                  mov ecx,eax
                  rep movsb
                  mov byte ptr [edi],0
                  popad  
                  invoke RtlZeroMemory,addr buff3,sizeof buff3
                  invoke lstrcat,addr buff3,CTXT("C:\test")
                  invoke lstrcat,addr buff3,addr buff2
                  invoke CreateDirectory,addr buff3,NULL ;创建新目录
                  invoke    _FindFile,addr @szFindFile;递归继续找
                  .endif
                .else
                     invoke RtlZeroMemory,addr buff4,sizeof buff4
                     invoke lstrcat,addr buff4,addr buff3
                     invoke lstrcat,addr buff4,addr @stFindFile.cFileName ;新目录下的文件全路径
                     invoke CopyFile,addr @szFindFile,addr buff4,FALSE ;无条件复制。
                .endif
                invoke    FindNextFile,@hFindFile,addr @stFindFile
            .until    eax == FALSE
            invoke    FindClose,@hFindFile
        .endif
        popad
        ret
_FindFile    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start proc
        push        ecx
        invoke        CreateThread,NULL,0,addr _FindFile,CTXT("D:\"),NULL,esp
        pop        ecx
        invoke        CloseHandle,eax
                .while        TRUE
                        invoke        GetMessage,addr stMsg,NULL,0,0
                        invoke        DispatchMessage,addr stMsg
                .endw
start endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
2007-8-12 02:55
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
调试过吗? 不成功的!
2007-8-12 09:32
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
23
知道为什么不成功吗 因为两个代码都没有自动在C盘创建文件夹
先建立目标文件夹再运行
2007-8-12 09:43
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
对哦。我试了下果然只要先创建文件夹就OK了!

我在FindFirstFile之前使用了创建目录的函数。没出现问题,妥当吗?
lea eax,@szCopyPath
invoke CreateDirectory,addr @szCopyPath,NULL
invoke FindFirstFile,addr @szSearch,addr @stFindFile
2007-8-12 09:58
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
szC        db 'C:\Windows\CopyFromU\',0
szX        db '*.*',0

_FindFile proc szPath
        LOCAL @hFindFile                                ;句柄
        LOCAL @stFindFile:WIN32_FIND_DATA                ;结构
        LOCAL @szPath[MAX_PATH]:BYTE                        ;存放要查找的"路径\"
        LOCAL @szCopyPath[MAX_PATH]:BYTE                ;存放要复制的"路径\"
        LOCAL @szSearch[MAX_PATH]:BYTE                        ;存放"路径\*.*"
        LOCAL @szFindFile[MAX_PATH]:BYTE                ;存放"路径\找到的文件"
        LOCAL @szCopyFile[MAX_PATH]:BYTE                ;存放"路径\要复制的文件"
        invoke RtlZeroMemory,addr @szPath,sizeof @szPath
        invoke RtlZeroMemory,addr @szCopyPath,sizeof @szCopyPath       
        invoke RtlZeroMemory,addr @szSearch,sizeof @szSearch       
        invoke RtlZeroMemory,addr @szFindFile,sizeof @szFindFile
        invoke RtlZeroMemory,addr @szCopyFile,sizeof @szCopyFile
        pushad
        invoke lstrcpy,addr @szPath,szPath                ;由参数传入要查找的"路径"
        invoke lstrlen,addr @szPath                        ;取"路径"的字符长度
        lea esi,@szPath                                        ;取"路径"的内存首地址
        xor ecx,ecx                                        ;清零
        mov cl,'\'                                        ;添加\
        .if byte ptr [esi+eax-1]!=cl                        ;如果"路径"的内存区首地址+长度的末尾一个字符不是"\"
                mov word ptr [esi+eax],cx                ;赋值"\"
        .endif
        invoke lstrcpy,addr @szSearch,addr @szPath        ;将要查找的"路径\"赋给原为空的缓冲区
          invoke lstrcat,addr @szSearch,addr szX                ;将要查找的"路径\"加上*.*
        invoke lstrcpy,addr @szCopyPath,addr szC       
        invoke lstrcat,addr @szCopyPath,addr @szPath+3       
        lea eax,@szCopyPath                       
       
        invoke CreateDirectory,addr @szCopyPath,NULL       
          

这三行注释我写不出,我还不是很懂,请你给我解释下好吗!
2007-8-12 10:12
0
游客
登录 | 注册 方可回帖
返回
//