欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【VBA研究】如何用VBA读取文件的日期时间

程序员文章站 2022-07-04 19:46:12
...

iamlaosong文

文件的日期时间分创建时间和修改时间,文件一旦创建,创建时间就定下不变了,所以日常应用中一般都是取修改时间,我的一个应用(生成二维码)中就是取这个时间判断图片文件是否重新生成。

1、取文件的修改时间VBA有专门的函数FileDateTime,如下面的语句:

    PicName = ThisWorkbook.Path & "\YiCode.bmp"
    t_now = Now()
    tim1 = Timer
    GenPic = "Fail"
    '此处省略。。。。。
    Do While Timer < tim1 + 5   '5秒内文件日期没变化则编码失败
        If t_now <= FileDateTime(PicName) Then
            GenPic = "OK"
            UpdatePic
            Exit Do
        End If
    Loop

2、如果必须取文件的创建时间,则需要用到文件系统对象了,其属性:

DateCreated 属性 
返回指定文件或文件夹的创建日期和时间。 
DateLastModified属性 
返回最后一次修改指定文件或文件夹的日期和时间
DateLastAccessed属性 
返回最后一次访问指定文件或文件夹的日期和时间

3、关于这三个时间的几个问题

1)文件创建时间和修改时间一致的问题。这是因为文件是在编辑完成之后才保存的,所以创建时间和修改时间是一致的,就像你用word敲了一篇稿子,敲完后保存成文件,这时候文件的创建时间和修改时间是一致辞的,如果你再没有打开过这个文件,那么连访问时间也是一致的。
2)文件创建时间晚于修改时间的问题。这个创建时间是指文件在你的电脑上创建的时间,而并非该文件最初产生的时间,最简单的,你把文件复制一份,看看创建时间,是不是在修改时间之后?答案是肯定的。
3、关于文件的访问时间。这个时间现在和修改时间一致,当初定义的这个访问时间是跟着访问修改的(访问不只是只读不写,查看目录属性也是访问),但随着硬盘的增大,文件的增多,几十万个文件都是常事,如果读操作再加一个写操作,那么这个确实会影响电脑的性能,用户体验也不好,所以从 XP2003 SP1起,为了性能,默认把LastAccessTime(最后访问时间)给禁用了。只有在修改文件时,才会顺便更新访问时间。

下图是各个文件系统对时间的支持情况:

【VBA研究】如何用VBA读取文件的日期时间

* 默认禁用是可以打开的,命令如下(0是打开,1是禁用):

fsutil behavior set disablelastaccess 0

【VBA研究】如何用VBA读取文件的日期时间

4、提取文件的这些属性,看下面例子:

Sub Command1_Click()
    Application.ScreenUpdating = False
    Set fso = CreateObject("Scripting.FileSystemObject")
    strfile = Application.InputBox("请输入文件的完整名称:", "请输入文件的完整名称:", , , , , , 2)
    Set objfile = fso.GetFile(strfile)
    If fso.fileexists(strfile) Then
        
        sReturn = "文件属性: " & objfile.Attributes & vbCrLf
          
        sReturn = sReturn & "文件创建日期: " & objfile.DateCreated & vbCrLf
          
        sReturn = sReturn & "文件修改日期: " & objfile.DateLastModified & vbCrLf
          
        sReturn = sReturn & "文件大小 " & FormatNumber(objfile.Size / 1024, -1)
          
        sReturn = sReturn & "Kb" & vbCrLf
          
        sReturn = sReturn & "文件类型: " & objfile.Type & vbCrLf
 
        MsgBox sReturn
 
    Else
        MsgBox strfile & " :不存在"
    End If
    Application.ScreenUpdating = True
End Sub