楼主的可以自定义文件时间,这样自主性比较大。不过有时候就是麻烦了点。
偶也贴上一个,是“借用”别的文件的时间。。。参数比较简单点。。
CopyFileTime.asm
复制内容到剪贴板
代码:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 命令行下复制文件的时间
; By taiwansee
; 2008.05.17
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hOutputBuf DWORD ?
lpCreationTime FILETIME <>
lpLastAccessTime FILETIME <>
lpLastWriteTime FILETIME <>
.data
szUSEAGE BYTE 0dh,0ah
BYTE '*************************************************************',0dh,0ah
BYTE '* Copy File Time *',0dh,0ah
BYTE '* By taiwansee 2008.05.17 *',0dh,0ah
BYTE '*************************************************************',0dh,0ah
BYTE '-Tested on: Windows 2000/XP/2003',0dh,0ah
BYTE '-USEAGE: %s Source.asp Destination.asp ',0dh,0ah,0
szOpenSourceFileErr BYTE 'Open Source File Failed!',0dh,0ah,0
szOpenDesFileErr BYTE 'Open Destination File Failed!',0dh,0ah,0
szGetSourceFileTimeErr BYTE 'Get Source File Time Failed!',0dh,0ah,0
szSetDesFileTimeErr BYTE 'Set Destination File Time Failed!',0dh,0ah,0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
include _CmdLine.asm
;********************************************************
; 显示出错信息
;********************************************************
_ShowError proc _lpError
local @dwWritten:dword,\
@szBuffer[MAX_PATH]:byte,\
@dwBufSize:dword,\
@hOutputBuf:dword
pushad
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov @hOutputBuf,eax
invoke lstrlen,_lpError
mov @dwBufSize,eax
invoke WriteConsole,@hOutputBuf,addr @szBuffer,@dwBufSize,addr @dwWritten,NULL
popad
ret
_ShowError endp
;********************************************************
; 显示帮助信息
;********************************************************
_ShowUSEAGE proc
local @lpInputBuf:dword,\
@szBuffer[MAX_PATH*2]:byte,\
@szProcessNameBuf[MAX_PATH]:byte,\
@dwWritten:dword,\
@dwBufSize:dword
pushad
invoke _argv,0,addr @szProcessNameBuf,sizeof @szProcessNameBuf
invoke wsprintf,addr @szBuffer,offset szUSEAGE,addr @szProcessNameBuf
invoke lstrlen,addr @szBuffer
mov @dwBufSize,eax
invoke WriteConsole,hOutputBuf,addr @szBuffer,@dwBufSize,addr @dwWritten,NULL
popad
ret
_ShowUSEAGE endp
;********************************************************
; 主程序
;********************************************************
_WinMain proc
local @szSourceFile[MAX_PATH]:byte,\
@szDestinationFile[MAX_PATH]:byte,\
@hDestinationFile:dword,\
@hSourceFile:dword
;********************************************************************
; 获取命令行参数
;********************************************************************
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov hOutputBuf,eax
;检查输入的参数个数是否正确
invoke _argc ;获取参数个数
.if eax!=3
call _ShowUSEAGE
jmp exit
.endif
invoke _argv,1,addr @szSourceFile,sizeof @szSourceFile
invoke _argv,2,addr @szDestinationFile,sizeof @szSourceFile
;********************************************************************
; 打开文件
;********************************************************************
;打开被拷贝时间的文件。。。。
invoke CreateFile,addr @szSourceFile,GENERIC_READ,\
FILE_SHARE_READ,NULL,OPEN_EXISTING,\
FILE_ATTRIBUTE_NORMAL,NULL
.if eax == INVALID_HANDLE_VALUE
invoke _ShowError,offset szOpenSourceFileErr
jmp exit
.endif
mov @hSourceFile,eax
;打开目标文件。。。。
invoke CreateFile,addr @szDestinationFile,GENERIC_READ or GENERIC_WRITE,\
FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,OPEN_EXISTING,\
FILE_ATTRIBUTE_NORMAL,NULL
.if eax == INVALID_HANDLE_VALUE
invoke _ShowError,offset szOpenDesFileErr
jmp exit
.endif
mov @hDestinationFile,eax
;********************************************************************
; 设置文件时间
;********************************************************************
;获取文件时间
invoke GetFileTime,@hSourceFile,offset lpCreationTime,\
offset lpLastAccessTime,\
offset lpLastWriteTime
.if eax==0
invoke _ShowError,offset szGetSourceFileTimeErr
jmp exit
.endif
;设置文件时间
invoke SetFileTime,@hDestinationFile,offset lpCreationTime,\
offset lpLastAccessTime,\
offset lpLastWriteTime
.if eax==0
invoke _ShowError,offset szSetDesFileTimeErr
jmp exit
.endif
exit:
ret
_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _WinMain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start_CmdLine.asm
复制内容到剪贴板
代码:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; _CmdLine.asm
; 命令行参数分析的通用子程序
; 功能:
; _argc ---> 对命令行参数进行数量统计
; _argv ---> 取某个命令行参数;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
CHAR_BLANK equ 20h ;定义空格
CHAR_DELI equ '"' ;定义分隔符
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 取命令行参数个数 (arg count)
; 参数个数必定大于等于 1, 参数 1 为当前执行文件名
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_argc proc
local @dwArgc
pushad
mov @dwArgc,0
invoke GetCommandLine
mov esi,eax
cld
_argc_loop:
;********************************************************************
; 忽略参数之间的空格
;********************************************************************
lodsb
or al,al
jz _argc_end
cmp al,CHAR_BLANK
jz _argc_loop
;********************************************************************
; 一个参数开始
;********************************************************************
dec esi
inc @dwArgc
_argc_loop1:
lodsb
or al,al
jz _argc_end
cmp al,CHAR_BLANK
jz _argc_loop ;参数结束
cmp al,CHAR_DELI
jnz _argc_loop1 ;继续处理参数内容
;********************************************************************
; 如果一个参数中的一部分有空格,则用 " " 包括
;********************************************************************
@@:
lodsb
or al,al
jz _argc_end
cmp al,CHAR_DELI
jnz @B
jmp _argc_loop1
_argc_end:
popad
mov eax,@dwArgc
ret
_argc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 取指定位置的命令行参数
; argv 0 = 执行文件名
; argv 1 = 参数1 ...
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_argv proc _dwArgv,_lpReturn,_dwSize
local @dwArgv,@dwFlag
pushad
inc _dwArgv
mov @dwArgv,0
mov edi,_lpReturn
invoke GetCommandLine
mov esi,eax
cld
_argv_loop:
;********************************************************************
; 忽略参数之间的空格
;********************************************************************
lodsb
or al,al
jz _argv_end
cmp al,CHAR_BLANK
jz _argv_loop
;********************************************************************
; 一个参数开始
; 如果和要求的参数符合,则开始复制到返回缓冲区
;********************************************************************
dec esi
inc @dwArgv
mov @dwFlag,FALSE
mov eax,_dwArgv
cmp eax,@dwArgv
jnz @F
mov @dwFlag,TRUE
@@:
_argv_loop1:
lodsb
or al,al
jz _argv_end
cmp al,CHAR_BLANK
jz _argv_loop ;参数结束
cmp al,CHAR_DELI
jz _argv_loop2
cmp _dwSize,1
jle @F
cmp @dwFlag,TRUE
jne @F
stosb
dec _dwSize
@@:
jmp _argv_loop1 ;继续处理参数内容
_argv_loop2:
lodsb
or al,al
jz _argv_end
cmp al,CHAR_DELI
jz _argv_loop1
cmp _dwSize,1
jle @F
cmp @dwFlag,TRUE
jne @F
stosb
dec _dwSize
@@:
jmp _argv_loop2
_argv_end:
xor al,al
stosb
popad
ret
_argv endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>nmake文件
复制内容到剪贴板
代码:
NAME = CopyFileTime
OBJS = $(NAME).obj
LINK_FLAG = /subsystem:console
ML_FLAG = /c /coff
$(NAME).exe: $(OBJS)
Link $(LINK_FLAG) $(OBJS)
.asm.obj:
ml $(ML_FLAG) $<
clean:
del *.obj
del *.exe
del *.res
del *.bak附编译好的二进制文件:
CopyFileTime.rar (1.09 KB)
[
本帖最后由 taiwansee 于 2008-5-17 20:55 编辑 ]