获取文件大小、时间

本文介绍了如何在Windows环境下,使用API函数GetFileSize、GetFileTime和FindFirstFile来获取文件的大小和创建时间。详细阐述了转换文件时间结构为SYSTEMTIME的过程,并提供了实例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

获取文件大小时间:

(1)GetFileSize

(2)GetFileTime

(3)FindFirstFile的WIN32_FILE_DATA结构获取时间和大小等

注意:

(1)文件时间结构FILETIME通过 FileTimeToSystemTime转换为SYSTEMTIME结构

(2)SYSTEMTIME结构里的元素都是word类型,需要用movzx转换为dword,直接使用word会有问题

实例:

(1)GetFileSize

       _GetSize    proc                   ;获取文件大小
         LOCAL   @szfileSelectedName[MAX_PATH]:byte
         LOCAL   @szBuffer[100]:byte       
         LOCAL   @dwFileSize
                          
         invoke GetDlgItemText,hWinMain,IDC_FILE,addr @szfileSelectedName,MAX_PATH
         invoke CreateFile, addr @szfileSelectedName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0 ;获取文件句柄
         .if     eax == INVALID_HANDLE_VALUE
              invoke MessageBox,NULL,offset szWrong,offset szCaption,MB_OK
         .else
              mov     hFile,eax                          ;保存句柄
              invoke GetFileSize,hFile,addr @dwFileSize ;获取文件大小
              mov     ebx,eax                            ;低32位返回值在eax里,高32位在addr @dwFileSize里,暂不考虑
              invoke wsprintf,addr @szBuffer,addr szSize,ebx                  
              invoke SetDlgItemText,hWinMain,IDC_SIZEINFO,addr @szBuffer            
            
         .endif
         invoke CloseHandle,hFile
ret

_GetSize endp

(2)GetFileTime

_GetCreateTime    proc                   ;获取文件大小
         LOCAL   @szfileSelectedName[MAX_PATH]:byte
         LOCAL   @szBuffer[100]:byte            
         LOCAL   @stFileCreateTime:FILETIME
         LOCAL   @stFileCreateSysTime:SYSTEMTIME
                 
         invoke GetDlgItemText,hWinMain,IDC_FILE,addr @szfileSelectedName,MAX_PATH       
         invoke CreateFile, addr @szfileSelectedName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0 ;获取文件句柄
         .if     eax == INVALID_HANDLE_VALUE
              invoke MessageBox,NULL,offset szWrong,offset szCaption,MB_OK
         .else
              mov     hFile,eax                          ;保存句柄
                
              invoke GetFileTime,hFile,addr @stFileCreateTime,NULL, NULL ;仅获取文件创建日期,
            ; invoke GetFileTime,hFile,addr @stFileCreateTime,addr @stFileLastAccessTime, addr @stFileLastWriteTime ;文件时间属性
              invoke FileTimeToSystemTime,addr @stFileCreateTime,addr @stFileCreateSysTime ;转换文件创建日期
              movzx   eax,@stFileCreateSysTime.wYear
              movzx   ebx,@stFileCreateSysTime.wMonth
              movzx   ecx,@stFileCreateSysTime.wDay
              movzx   edx,@stFileCreateSysTime.wHour ;word 转化成 dword,否则显示不正常
              movzx   esi,@stFileCreateSysTime.wMinute
              movzx   edi,@stFileCreateSysTime.wSecond
              invoke wsprintf,addr @szBuffer,addr szTime,eax,ebx,ecx,edx,esi,edi                  
              invoke SetDlgItemText,hWinMain,IDC_TIME,addr @szBuffer

         .endif
              invoke CloseHandle,hFile
ret

_GetCreateTime endp

(3)FindFirstFile的WIN32_FILE_DATA结构

_FindFirstFileSize    proc
         LOCAL   @szfileSelectedName[MAX_PATH]:byte
         LOCAL   @szBuffer[100]:byte            
         LOCAL   @stFileLastAccessSysTime:SYSTEMTIME
         LOCAL   @stWin32FindData:WIN32_FIND_DATA
                 
         invoke GetDlgItemText,hWinMain,IDC_FILE,addr @szfileSelectedName,MAX_PATH       
         invoke CreateFile, addr @szfileSelectedName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0 ;获取文件句柄
         .if     eax == INVALID_HANDLE_VALUE
              invoke MessageBox,NULL,offset szWrong,offset szCaption,MB_OK
         .else
              invoke CloseHandle,hFile               
              invoke FindFirstFile,addr @szfileSelectedName,addr @stWin32FindData
              .if   eax != INVALID_HANDLE_VALUE
                    mov hFile,eax
                    invoke CloseHandle,hFile                   
                    mov ebx,@stWin32FindData.nFileSizeLow ;低32位
                    invoke wsprintf,addr @szBuffer,addr szSize,ebx                  
                    invoke SetDlgItemText,hWinMain,IDC_FINDFIRSTFILE,addr @szBuffer ;大小完成
                    ;开始读最后访问时间,利用 @stWin32FindData.ftLastAccessTime文件时间结构
                    invoke FileTimeToSystemTime,addr @stWin32FindData.ftLastAccessTime,addr @stFileLastAccessSysTime
                    movzx   eax,@stFileLastAccessSysTime.wYear
                    movzx   ebx,@stFileLastAccessSysTime.wMonth
                    movzx   ecx,@stFileLastAccessSysTime.wDay
                    movzx   edx,@stFileLastAccessSysTime.wHour ;word 转化成 dword,否则显示不正常
                    movzx   esi,@stFileLastAccessSysTime.wMinute
                    movzx   edi,@stFileLastAccessSysTime.wSecond
                    invoke wsprintf,addr @szBuffer,addr szTime,eax,ebx,ecx,edx,esi,edi                  
                    invoke SetDlgItemText,hWinMain,IDC_FINDFIRSTFILETIME,addr @szBuffer
                         
              .endif
         .endif        

ret

_FindFirstFileSize endp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值