2
www.ChF-Online.de  

Zeitstempel von Dateien auslesen und setzen

   Neuigkeiten
   API-Aufrufe in VBA
 Belieb. Datei öffnen
 CommonDialog-Fehler
aktiv aktiv Dateidatum lesen & setzen
 rel. Dateipfad korrigieren
 Flex. Öffnen-Dialog
 Flex. Speichern-Dialog
 Kurze Unterbrechung
 Pfade und Verzeichnisse
 Spracheinstellung
 TreeView löschen
 Verzeichnisauswahl
 Verzeichnisauswahl /UNC
   VBA2HTML
   Word
   Word-VBA
   Word2007 (RibbonX)
   Word2010 (RibbonX)
   Outlook-VBA
   Links zu VB(A)
   DocToHelp
   Netport Express XL
   Astronomie
   Gästebuch
   Volltextsuche
   Sitemap
   Buch:Word-Programmierung
   Impressum & Kontakt
   Datenschutzerklärung
Getestet unter Word2000Getestet unter WordXPGetestet unter Win2000  
Beispiel anzeigen
Makro/Datei speichern
Print

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:

  • Erstellungsdatum
  • Letzter Lesezugriff (nur Datum ohne Zeitangabe)
  • Letzter Schreibzugriff

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.
Beim Setzen können zum Umrechnen eines Datums die APIs LocalFileTimeToFileTime und SystemTimeToFileTime und zum Schreiben das API SetFileTime verwendet werden.

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:
Es muss zuerst aus dem Systemzeit-Format in das (lokale) Dateizeit-Format umgewandelt werden. Anschließend erfolgt dann die Umrechnung in das universelle Dateizeit-Format (UTC).
Das API SetFileTime setzt dann eine oder alle Datumsangaben. Das zusätzlich benötigte API CreateFile ermöglicht dabei erst den Dateizugriff, da es den benötigten File-Handle auf die Datei zurückliefert, wenn auf die Datei zugegriffen werden kann.

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.
Über ein Eingabefeld kann dann ein Datum den verschiedenen Datumsangaben optional zugewiesen werden.

Wichtig:
Alle Änderungen an den Dateien können nicht rückgängiggemacht werden und erfolgen auf eigene gefahr hin!


 Besucher: 3 online  |  46 heute  |  2407 diesen Monat  |  2149407 insgesamt | Seitenaufrufe: 119   Letzte Änderung: 24.06.2006 © 2001-18 Christian Freßdorf
  Wir suchen das Wissen, das wir durch Information verloren haben. T. S. Eliot  powered by phpCMS and PAX