1. 程式人生 > >【VBA研究】如何用VBA讀取檔案的日期時間

【VBA研究】如何用VBA讀取檔案的日期時間

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(最後訪問時間)給禁用了。只有在修改檔案時,才會順便更新訪問時間。

下圖是各個檔案系統對時間的支援情況:

* 預設禁用是可以開啟的,命令如下(0是開啟,1是禁用):

fsutil behavior set disablelastaccess 0

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