Zeitstempel von Dateien auslesen und setzen |
|
|||||||||||||||||||||
Für Zeitmanipulationen, um z.B. die Speicherzeit (inkl. Datum) einer Datei auszulesen und zu ändern, kann auf eine Gruppe von API-Aufrufen zurückgegriffen werden, die das Auslesen, das notwendige Umrechnen und das Setzen der Zeitangaben ermöglichen. Hierbei wird zwischen drei verschiedenen Datumsangaben unterschieden:
Das Ermitteln einer dieser Datumsangaben erfolgt dabei nicht in einem Schritt, sondern zuerst muss das jeweilige Datum in ein universelle Dateizeit-Format (UTC=Coordinated Universal Time) umgerechnet bzw. aus diesem ermittelt werden (Das Dateizeit-Format Datumsformat behandelt die Angaben als 64-Bit Integer Zahlen). Beim Auslesen stehen neben dem API GetFileTime zur Ermittlung der Datumsangaben die APIs FileTimeToLocalFileTime und FileTimeToSystemTime zur Umrechnung in ein weiterverwertbares Format zur Verfügung. Um die Datumsangaben einer Datei zu erhalten, muss dem API GetFileTime nue der Dateihandle (entspricht einer Zugriffsnummer auf die Datei) mitgegeben werden. Als Rückgabewert stehen dann die drei Datumsangaben in den Type-Strukturen CT (CreateTime), LAT (LastAccessTime), LWT (LastWriteTime). Anschließend müssen die Angaben zuerst in das lokalen Dateizeit-Format (FT=FileTime) und danach noch in das Systemzeit-Format (ST=SystemTime) umgewandelt werden, da letzteres das normale lesbare Format besitzt. 'Konstanten Const c_CreationTime As Integer = 1 Const c_LastAccessTime As Integer = 2 Const c_LastWriteTime As Integer = 3 Function fkt_getTime(sFile As String, iType As Integer) As Date ' setzt einen Dateistempel auf ein Datum/Uhrzeit Dim ST As SYSTEMTIME Dim CT As FILETIME Dim LAT As FILETIME Dim LWT As FILETIME Dim FT As FILETIME Dim hFile As Long Dim lngRet As Long Dim dtDate As Date ' File-Handle ermitteln hFile = CreateFile(sFile, GENERIC_WRITE, _ FILE_SHARE_WRITE Or FILE_SHARE_READ, _ ByVal 0&, OPEN_EXISTING, 0, 0) ' Select Case iType Case c_CreationTime '1 GetFileTime hFile, CT, LAT, LWT FileTimeToLocalFileTime CT, FT FileTimeToSystemTime FT, ST Case c_LastAccessTime '2 GetFileTime hFile, CT, LAT, LWT FileTimeToLocalFileTime LAT, FT FileTimeToSystemTime FT, ST Case c_LastWriteTime '3 GetFileTime hFile, CT, LAT, LWT FileTimeToLocalFileTime LWT, FT FileTimeToSystemTime FT, ST End Select fkt_getTime = Str$(ST.iDay) & "." & Str$(ST.iMonth) & "." & Str$(ST.iYear) & _ " " & Str$(ST.iHour) & ":" & Str$(ST.iMinute) & ":" & Str$(ST.iSecond) End Function Das Ergebnis steht danach in der Type-Struktur von ST und kann so weiterverwendet werden, z.B. ST.iDay. Beim Setzen eines Datums geht man den umgekehrten Weg: Möchte man nur gezielt ein Datum ändern, z.B. das Erstellungsdatum, so müssen laut Deklaration des API auch die anderen beiden Angaben im Aufruf mitangegeben werden. Um die vorhandenen Angaben nun zu behalten, genögt es, als Parameter die &O0 anzugeben. Die folgende Funktion setzt nun bei einer angegebenen Datei sFile nur die Datumsangaben der Dateierstellung auf eine angegebene Zeit dtDate: Function fkt_setTime(sFile, dtDate As Date) As String ' setzt einen Dateistempel auf ein Datum/Uhrzeit Dim ST As SYSTEMTIME Dim FT As FILETIME Dim hFile As Long Dim lngRet As Long ' zuweisen der verschiedenen Zeitangaben With ST .iDay = Day(dtDate) .iMonth = Month(dtDate) .iYear = Year(dtDate) .iHour = Hour(dtDate) .iMinute = Minute(dtDate) .iSecond = Second(dtDate) End With ' SYSTEMTIME-Struktur in eine FILETIME-Struktur wandeln: lngRet = SystemTimeToFileTime(ST, FT) ' FILETIME-Struktur in GMT-Zeitangabe umwandeln lngRet = LocalFileTimeToFileTime(FT, FT) ' Datei (nur unter Windows NT/2000 auch: Verzeichnis) ' für Schreibzugriff öffnen hFile = CreateFile(sFile, GENERIC_WRITE, _ FILE_SHARE_WRITE Or FILE_SHARE_READ, _ ByVal 0&, OPEN_EXISTING, _ FILE_FLAG_BACKUP_SEMANTICS, 0) ' Bei erfolgreichem Öffnen die Zeitstempel schreiben If hFile <> INVALID_HANDLE_VALUE Then lngRet = SetFileTime(hFile, FT, &O0, &O0) CloseHandle hFile fkt_setTime = "" Else fkt_setTime = "Konnte nicht auf " & sFile & " zugreifen." End If End Function In dem bereitgestellten Beispiel findet Ihr eine Userform, über die eine beliebige Datei ausgewählt werden kann, für die dann die Datumsangaben angezeigt werden. Wichtig: |
www.chf-online.de/api/datumsetzen.htm | © 2001-11 Christian Freßdorf (Zaphod-Systems) |