Page 1 of 1

FileTime (Win API)

Posted: Sat Aug 05, 2006 10:17 am
by horst
Code updated for 5.20+

If anyone wants to use the FileTime of the Windows API, here are some functions and macros using Quad variables:

+ FileTime.Q = GetFileTime(path,stamp)
+ GetSystemTimeAsFileTime_(@Now.Q)
+ FileTimeToLocalFileTime_(@FileTime,@Local.Q)
+ PBdate = PBdateFromFileTime(ftQuad)
+ FileTime.Q = FileTimeFromPBdate(PBdate)

Code: Select all

; ---------------------------------------------------------------
;  GetFileDate.pbi 
;- File Time thru Dir Search, Conversions 
; ---------------------------------------------------------------
; stamp_ = 0,1,2 or #PB_Date_Created, #PB_Date_Accessed, #PB_Date_Modified
; returns filetime as Quad (UTC) 

Procedure.q GetFileTime(path_.s,stamp_)   
  searchData.WIN32_FIND_DATA
  hFind = FindFirstFile_(path_,@searchData)
  If hFind <> #INVALID_HANDLE_VALUE
    *ft.quad = @searchData\ftCreationTime + stamp_ * SizeOf(filetime) 
    FindClose_(hFind)
    ProcedureReturn *ft\q
  Else 
    ProcedureReturn 0
  EndIf 
EndProcedure 

; Now you can use the System Time "As FileTime" (UTC) to compare 
; GetSystemTimeAsFileTime_(@Now.Q) 

; Convert a given FileTime (UTC, Quad) to local:
; FileTimeToLocalFileTime_(@FileTime,@Local.Q)

; PureBasic Date Conversions ------------------------------------

#PBdateBase = $019db1ded53e8000  ; quad
#ftUnitsInSecond = 10000000      ; filetime units  

Macro PBdateFromFileTime(ftQuad)  ; assumes Quad, produces Long PBdate
  (ftQuad - #PBdateBase) / #ftUnitsInSecond
EndMacro 

Macro FileTimeFromPBdate(PBdate)  ; assumes Long PBdate, produces Quad !! 
  (PBdate * #ftUnitsInSecond) + #PBdateBase
EndMacro 
And here a little test prog:

Code: Select all

; ------------------------------------------------------------
; test GetFileDate functions 
; ------------------------------------------------------------
file.s = "GetFileDate.pbi"  ; *** use any file to test ***
stamp = #PB_Date_Created    ; or #PB_Date_Accessed, #PB_Date_Modified

IncludeFile "GetFileDate.pbi"

Procedure DebugStamp(pbdate,text.s) 
  Debug FormatDate("%yyyy-%mm-%dd, %hh:%ii:%ss",PBdate) + "  " + text 
EndProcedure 

DebugStamp(GetFileDate(file,stamp),"PB FileDate, UTC")

filetime.Q = GetFileTime(file,stamp)
DebugStamp(PBdateFromFileTime(filetime),"API FileTime, UTC") 

FileTimeToLocalFileTime_(@FileTime,@Local.Q)
DebugStamp(PBdateFromFileTime(Local),"API FileTime, Local") 

GetSystemTimeAsFileTime_(@Now.Q)
DebugStamp(PBdateFromFileTime(Now),"API SystemTime, UTC") 

FileTimeToLocalFileTime_(@Now,@Local.Q)
DebugStamp(PBdateFromFileTime(local),"API SystemTime, Local") 

End