能力值:
( LV2,RANK:10 )
|
-
-
2 楼
希望得到各位帮助
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
顶一下。我是新手,请不要冷落我。HELP~~~~~~~~~~
|
能力值:
(RANK:210 )
|
-
-
4 楼
invoke CopyFile,addr lpFileName,addr lpDirBuffer,FALSE
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
哦天呢,好愚蠢的错误~~~~~~
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
再问下,如果我想复制D盘所有文件到E盘。该如何做?
|
能力值:
( LV12,RANK:290 )
|
-
-
7 楼
递归,一个个复制
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
有没有现成做好掉的代码给我鉴戒学习?
递归遍历与复制的思路N人跟我提过了,我也懂。就是代码实现起来对我的水平有难度
|
能力值:
(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
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
盼星星盼月亮,终于盼到有高手愿意为我写这代码了!!!!!
可惜只复制一层目录,子目录下的文件都没被复制。
我回头也去思考下,另外我对你表示强烈的感谢!!!!
|
能力值:
(RANK:210 )
|
-
-
11 楼
不是吧 呵呵 我只是用od调试了两层 没敢运行 你自己试试改改
刚才又调试了一下 发现ecx没有清零的原因
在 lea esi,@szPath
mov cl,'\'
.if byte ptr [esi+eax-1]!=cl
前面加上
xor ecx,ecx
就可以了
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
int SHFileOperation(LPSHFILEOPSTRUCT lpFileOp);
|
能力值:
( 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
|
能力值:
(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中保存的是长度.
===============
|
能力值:
( 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段就能灵活改变复制的起始目录
|
能力值:
(RANK:210 )
|
-
-
16 楼
我都试过成功了不知道你怎么搞的
你直接改D:\为D:\VPC\当然不可以了,
因为代码中是的目录是直接把C:改成D:的 两个的字符长度必须一样
害得我又试了一下,C盘下一堆垃圾......... 你咋不思考思考再来问呢
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
哦,知道了。看来我懂的还不够透彻,感谢你的热心帮助
如果我想D盘内的所有文件放到C:\TEMPDIR下,可以吗?怎样才能实现
|
能力值:
(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
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
谢谢,可以结帖了!
这真是个相当好的例子,以后我要常常啃它
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
怎么运行了不会来
|
能力值:
( 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
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
调试过吗? 不成功的!
|
能力值:
(RANK:210 )
|
-
-
23 楼
知道为什么不成功吗 因为两个代码都没有自动在C盘创建文件夹
先建立目标文件夹再运行
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
对哦。我试了下果然只要先创建文件夹就OK了!
我在FindFirstFile之前使用了创建目录的函数。没出现问题,妥当吗?
lea eax,@szCopyPath
invoke CreateDirectory,addr @szCopyPath,NULL
invoke FindFirstFile,addr @szSearch,addr @stFindFile
|
能力值:
( 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
这三行注释我写不出,我还不是很懂,请你给我解释下好吗!
|
|
|