首页
社区
课程
招聘
程序目的是取得文件的建立时间并以...(请高手帮忙)
发表于: 2006-11-16 15:22 3932

程序目的是取得文件的建立时间并以...(请高手帮忙)

2006-11-16 15:22
3932
;程序目的是取得文件的建立时间并以建立时间更新些此文件的名称
;程序invoke MessageBox,NULL,addr szBuffer,offset szCaption,MB_OK运行后产生的对话框为什么和正常的对话框有所不同?
;新文件名应该怎么完成字符串连接?为什么取得的文件时间不对?

                .386
                .model flat,stdcall
                option casemap:none

include                c:\masm32\include\windows.inc
include                c:\masm32\include\gdi32.inc
includelib        c:\masm32\lib\gdi32.lib
include                c:\masm32\include\user32.inc
includelib        c:\masm32\lib\user32.lib
include                c:\masm32\include\kernel32.inc
includelib        c:\masm32\lib\kernel32.lib

                .data?
hFile                db        ?
szTest                db        ?
lpCreatfile        db        ?
szBuffer        db        12 dup(?)

                .const
szFileName        db        'c:\\masm32\\js\\AutoBack\\pkm',0
szCaption        db        'AutoBack',0
szText                db        '读取文件失败!',0
szFormat        db        '文件读取成功-hFile:%08x',0dh,0
szDataF                db        'c:\\masm32\\js\\AutoBack\\pkm%02d-%02d-%02d',0dh,0

                .code
_WinMain        proc       
                local        @hFile,@szBuffer
                local        @Filetime:FILETIME
                local        @stUTC:SYSTEMTIME

                invoke        CreateFile,addr szFileName,\
                                        GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
        .if        eax == INVALID_HANDLE_VALUE
                invoke        MessageBox,NULL,offset szText,offset szCaption,MB_OK
                invoke        ExitProcess,NULL
        .else
                mov @hFile,eax
                invoke        wsprintf,addr @szBuffer,addr szFormat,@hFile
                invoke        MessageBox,NULL,addr @szBuffer,offset szCaption,MB_OK
                invoke        GetFileTime,@hFile,addr @Filetime,NULL,NULL
                invoke        FileTimeToSystemTime,addr @Filetime,addr @stUTC
                invoke        wsprintf,addr szBuffer,addr szDataF,@stUTC.wDay,@stUTC.wMonth,@stUTC.wYear
                invoke        MessageBox,NULL,addr szBuffer,offset szCaption,MB_OK
               
;                invoke        MoveFile,szFileName,szBuffer

                invoke        ExitProcess,NULL
        .endif

_WinMain endp

start:
                call        _WinMain
               

                end        start

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 156
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
要把时间扩展到32位

老了  眼花了
2006-11-16 15:50
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
3
你说的我只听懂一点点,我只写了取得文件创建的时间的代码:

.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

    .data?
szBuffer  db  256 dup(?)
lpCreationTime FILETIME <?>
    .const
szFileName  db 'c:\123.txt',0   
szCaption  db  'AutoBack',0
szText    db  '读取文件失败!',0
szDataF    db  '文件创建的时间是:%d年%d月%d日',0

    .code   
_WinMain  proc  
    local  @hFile:DWORD
    local  @stUTC:SYSTEMTIME
    invoke  CreateFile,addr szFileName,\
          GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
  .if  eax == INVALID_HANDLE_VALUE
  invoke  MessageBox,NULL,offset szText,offset szCaption,MB_OK
  invoke  ExitProcess,NULL
  .elseif
   mov @hFile,eax
    invoke  GetFileTime,@hFile,addr lpCreationTime,NULL,NULL
    invoke  FileTimeToSystemTime,addr lpCreationTime,addr @stUTC
    .if eax != NULL        ;返回值不为空
    movzx eax,@stUTC.wYear  ;把时间扩展到32位,并保存
    movzx edx,@stUTC.wMonth
    movzx ecx,@stUTC.wDay
    invoke  wsprintf,addr szBuffer,addr szDataF,eax,edx,ecx
    invoke  MessageBox,NULL,addr szBuffer,offset szCaption,MB_OK
    invoke ExitProcess,NULL
   .endif
   .endif
_WinMain endp
start:
    call  _WinMain
    end  start
2006-11-16 21:14
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
4
第一,你.if  eax == INVALID_HANDLE_VALUE 后
接着应该是 .elseif 而不是 .else
第二,GetFileTime是有返回值的,.if eax != NULL
不为空的时候才执行...
2006-11-16 21:17
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
找到一段相似的代码,对照看看:

http://blog.csdn.net/purpleendurer/archive/2006/10/02/1316776.aspx

MASM32编程获取文件最后修改时间
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;FileName: FileTime.asm
;Function: Show the last write time of file "C:\IO.SYS"
;  Author: Purple Endurer
;
;Date        Summary
;---------------------------------------------------------------------------
; 2006.10.28 Created and Passed!

.386
.model flat, stdcall
option casemap: none

include \masm32\include\windows.inc

include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

GetFileLastWriteTime PROTO :LPSTR, :LPSTR
SysTime2Str PROTO :DWORD, :LPSTR

; SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
.data
; SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
g_szFileSpec    db "C:\IO.SYS", 0

; SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
.data?
; SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
g_buf20 db 20 dup(?)

; SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
.code
; SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

start:
    invoke GetFileLastWriteTime, OFFSET g_szFileSpec, OFFSET g_buf20
    .if eax==0
        invoke MessageBox, NULL, OFFSET g_buf20, OFFSET g_szFileSpec, NULL
    .else
        invoke MessageBox, NULL, eax, OFFSET g_szFileSpec, NULL
    .endif
    invoke ExitProcess, NULL

;///////////////////////////////////////
; Get the last write time of a file
; input: lpstrFileSpec--the pointer to the file specifier
; output: eax > 0, fail, eax = the begin addr of error message
;         eax = 0, success, the time str is stored in g_buffer1
;///////////////////////////////////////
GetFileLastWriteTime PROC lpstrFileSpec: LPSTR, lpstrBuf: LPSTR
    LOCAL hOpenFile: HANDLE
    LOCAL stFileLastWriteTime: FILETIME
    LOCAL stLocalFileTime: FILETIME
    LOCAL stSysTime: SYSTEMTIME
    LOCAL dwResult: DWORD

    invoke CreateFile, lpstrFileSpec, GENERIC_READ, FILE_SHARE_READ, NULL,\
        OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL
    .if eax==INVALID_HANDLE_VALUE
        mov eax, OFFSET g_szFailToCreateFile
    .else        
        mov hOpenFile, eax

         ; BOOL GetFileTime(
         ;     HANDLE hFile,    // identifies the file
         ;     LPFILETIME lpCreationTime,    // address of creation time
         ;     LPFILETIME lpLastAccessTime,// address of last access time  
         ;     LPFILETIME lpLastWriteTime     // address of last write time
         ; );

        invoke GetFileTime, hOpenFile, NULL, NULL, ADDR stFileLastWriteTime
        .if eax == 0
            mov dwResult, OFFSET g_szGetFileTimeErr
        .else
             ; BOOL FileTimeToSystemTime(
             ;     CONST FILETIME *lpFileTime,    // pointer to file time to convert
             ;     LPSYSTEMTIME lpSystemTime     // pointer to structure to receive system time  
             ; );
            invoke FileTimeToLocalFileTime, ADDR stFileLastWriteTime, ADDR stLocalFileTime
            invoke FileTimeToSystemTime, ADDR stLocalFileTime, ADDR stSysTime
            .if eax==0
                mov dwResult, OFFSET g_szFileTimeToSystemTimeErr
            .else
                invoke SysTime2Str, ADDR stSysTime, lpstrBuf
                mov dwResult, 0
            .endif
        .endif
        invoke CloseHandle, hOpenFile
        mov eax, dwResult
    .endif

    ret
    g_szFailToCreateFile db "创建文件失败!", 0
    g_szGetFileTimeErr db "取文件时间失败!", 0
    g_szFileTimeToSystemTimeErr db "转换时间失败!", 0
GetFileLastWriteTime ENDP

SysTime2Str PROC lpSysTime: DWORD, lpstrBuf: LPSTR
    xor eax, eax
    jz @F
    g_szFmt4SysTime db "%d-%d-%d %d:%d:%d", 0
@@:
    pushad
    mov edi, lpSysTime
    assume edi: ptr SYSTEMTIME
    movzx eax, [edi].wYear
    movzx ebx, [edi].wMonth
    movzx ecx, [edi].wDay
    movzx edx, [edi].wHour
    movzx esi, [edi].wMinute
    movzx edi, [edi].wSecond
    assume edi: nothing
   
    invoke wsprintf, lpstrBuf, OFFSET g_szFmt4SysTime, eax, ebx, ecx, edx, esi, edi

    popad
    ret
SysTime2Str ENDP

end start

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1316776
2006-11-21 17:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看不懂
2006-11-21 17:34
0
游客
登录 | 注册 方可回帖
返回
//