Zeit und Datei-Alter...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
KatSeiko
Beiträge: 367
Registriert: 19.07.2008 07:47

Zeit und Datei-Alter...

Beitrag von KatSeiko »

Ich habe zwei Dinge. Zuerst einmal habe ich eine Datei, von der ich erfahren möchte, wann sie erstellt wurde. Mein Programm lädt die Datei von meinem Server...

In der Datei steht unter Anderem die Differenz der Serverzeit zur UTC. Aber wie stelle ich fest, wie die Differenz zwischen der UTC und dem Rechner, auf dem mein Programm läuft, ist?
Win7 Ultimate x64, PureBasic 5.11

There is no substitute..
BildBildBild
Little John

Beitrag von Little John »

Unter Windows, nehme ich an. Folgende API-Funktionen sollten helfen:

Code: Alles auswählen

GetTimeZoneInformation_()
FileTimeToLocalFileTime_()
Gruß, Little John
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Hier ein paar Codes:
Anzeige ala Windows:

Code: Alles auswählen

;PB 4.20 ,XP, kein Unicode
If OpenWindow(0, 0, 0, 400, 300, "Zeitangaben für Dateien", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  TextGadget(0, 10, 10, 400, 20, "Datei auswählen :", #PB_Text_Center)  
  ExplorerTreeGadget(1, 10, 30, 380, 260, "*.*", #PB_Explorer_NoDriveRequester)
  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_CloseWindow
      End 
    EndIf   
  Until EventType() = #PB_EventType_LeftDoubleClick And GetGadgetState(1) = #PB_Explorer_File
  File$ = GetGadgetText(1)
  hFile = ReadFile(0, File$)
  If hFile
    Create.FILETIME
    LastAccess.FILETIME
    LastWrite.FILETIME
    LocTime.SYSTEMTIME
    SysTime.SYSTEMTIME
    
    GetFileTime_(hFile, Create, LastAccess, LastWrite)  ;die 3 Zeiten auslesen
    
    FileTimeToLocalFileTime_(Create, LocTime)           ;erstellt am (hier GMT=UTC-Zeit)
    FileTimeToSystemTime_(LocTime, SysTime)             ;in lokale Zeit umrechnen    
    CTime$ = "Erstellt am "+Str(SysTime\wDay)+"."+RSet(Str(SysTime\wMonth),2,"0")+"."+Str(SysTime\wYear)
    CTime$ + " um "+Str(SysTime\wHour)+":"+RSet(Str(SysTime\wMinute),2,"0")+":"+RSet(Str(SysTime\wSecond),2,"0")+#LFCR$
   
    FileTimeToLocalFileTime_(LastWrite, LocTime)        ;geändert am (hier GMT=UTC-Zeit)
    FileTimeToSystemTime_(LocTime, SysTime)             ;in lokale Zeit umrechnen    
    GTime$ = "Geändert am "+Str(SysTime\wDay)+"."+RSet(Str(SysTime\wMonth),2,"0")+"."+Str(SysTime\wYear)
    GTime$ + " um "+Str(SysTime\wHour)+":"+RSet(Str(SysTime\wMinute),2,"0")+":"+RSet(Str(SysTime\wSecond),2,"0")+#LFCR$   
    
    FileTimeToLocalFileTime_(LastAccess, LocTime)       ;letzter Zugriff am (hier GMT=UTC-Zeit)
    FileTimeToSystemTime_(LocTime, SysTime)             ;in lokale Zeit umrechnen    
    LTime$ = "Letzter Zugriff am "+Str(SysTime\wDay)+"."+RSet(Str(SysTime\wMonth),2,"0")+"."+Str(SysTime\wYear)
    LTime$ + " um "+Str(SysTime\wHour)+":"+RSet(Str(SysTime\wMinute),2,"0")+":"+RSet(Str(SysTime\wSecond),2,"0")
       
    MessageRequester("Zeitangaben für " + File$, CTime$ + GTime$ + LTime$)
   Else
    MessageRequester("Fehler !", File$ + " will nicht !")
   
  CloseFile(0)
  EndIf
EndIf
Den Kompilierzeitpunkt von Exe-Dateien im PE-Format (wie sie z.B. PB erstellt) kann man so ermitteln:

Code: Alles auswählen

;PB 4.20 ,XP, kein Unicode
If OpenWindow(0, 0, 0, 400, 300, "Kompilierzeitpunkt von Exe - Dateien im PE - File - Format", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  TextGadget(0, 10, 10, 400, 20, "Exe - Datei auswählen :", #PB_Text_Center)  
  ExplorerTreeGadget(1, 10, 30, 380, 260, "*.exe", #PB_Explorer_NoDriveRequester)
  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_CloseWindow
      End 
    EndIf   
  Until EventType() = #PB_EventType_LeftDoubleClick And GetGadgetState(1) = #PB_Explorer_File
  File$ = GetGadgetText(1)
  If ReadFile(0, File$)
    FileSeek(0, $3C)                   ;Zeiger auf (eventuelle) PE-Kennung
    PEADR = ReadLong(0)
    FileSeek(0, PEADR)                 ;PE-Kennung
    If ReadLong(0) = $00004550         ;"PE  "
      FileSeek(0, PEADR + 8)           ;Kompilierzeitpunkt
      KompDatum = ReadLong(0)
      KompDatum$ = FormatDate("Jahr=%yyyy, Monat=%mm, Tag=%dd, Stunde=%hh, Minute=%ii, Sekunde=%ss",  KompDatum) 
      MessageRequester("Kompilierzeitpunkt von " + File$, KompDatum$)
     Else
      MessageRequester("Fehler !", File$ + " ist keine Datei im PE-File-Format !")
    EndIf
  CloseFile(0)
  EndIf
EndIf
Hier eine Zeitzonen-Auswertung:

Code: Alles auswählen

;PB 4.20 ,XP, kein Unicode

Global D$ 
Global W$

TZI.TIME_ZONE_INFORMATION 

Procedure Wochentag(D)
Select D
  Case 0 
    D$ = "Sonntag"
  Case 1 
    D$ = "Montag"
  Case 2 
    D$ = "Dienstag"
  Case 3 
    D$ = "Mittwoch"
  Case 4 
    D$ = "Donnerstag"
  Case 5 
    D$ = "Freitag"
  Case 6 
    D$ = "Samstag"
EndSelect 
EndProcedure

Procedure Woche(W)
Select W
  Case 1 To 4
    W$ = " am " + D$ + " der " + Str(W) + ". Woche des Monats"  
  Case 5
    W$ = " am " + D$ + " der letzten Woche des Monats"
EndSelect
EndProcedure

TZIR = GetTimeZoneInformation_(TZI)
Select TZIR
  Case #TIME_ZONE_ID_UNKNOWN                     ;= 0
    M$ = "Unbekannt"
    End 
  Case #TIME_ZONE_ID_STANDARD                    ;= 1
    M$ = PeekS(@TZI\StandardName, -1, #PB_Unicode) + #LFCR$ 
  Case #TIME_ZONE_ID_DAYLIGHT                    ;= 2
    M$ = PeekS(@TZI\DaylightName, -1, #PB_Unicode) + #LFCR$
  Case #TIME_ZONE_ID_INVALID                     ;= -1
    M$ = "Ungültig"
    End 
EndSelect

B$ = "Standard Unterschied zu UTC : " + Str(TZI\Bias) + " Minuten" + #LFCR$
SB$ = "Zusätzliche Abweichung : " + Str(TZI\StandardBias) + " Minuten" + #LFCR$
DL$ = "Sommerzeit-Unterschied : " + Str(TZI\DaylightBias) + " Minuten" + #LFCR$
S$ = "Umstellung auf Sommerzeit erfolgt im " + Str(PeekW(TZI\DaylightDate+2)) + ". Monat" ;oder Auswertung
N$ = "Umstellung auf Normalzeit erfolgt im " + Str(PeekW(TZI\StandardDate+2)) + ". Monat"

;Sommerzeit
D = PeekW(TZI\DaylightDate + 4)                  ;Wochentag der Umstellung
Wochentag(D)
W = PeekW(TZI\DaylightDate + 6)                  ;Woche des Monats
Woche(W)
S$ + W$ + " um " + Str(PeekW(TZI\DaylightDate + 8)) + " Uhr" + #LFCR$

;Normalzeit
D = PeekW(TZI\StandardDate + 4)                  ;Wochentag der Umstellung
Wochentag(D)
W = PeekW(TZI\StandardDate + 6)                  ;Woche des Monats
Woche(W)
N$ + W$ + " um " + Str(PeekW(TZI\StandardDate + 8)) + " Uhr"

MessageRequester("Zeitzone - Auswertung", M$ + B$ + SB$ + DL$ + S$ + N$)
Gruß
Helle
Antworten