Hilfe bei Zugriff auf Dateidatum

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Hilfe bei Zugriff auf Dateidatum

Beitrag von dibro »

Hi zusammen,
seit mehr als 10 Jahren habe ich nicht mehr programmiert (Rentner), vieles vergessen, muss jetzt aber ein kleines Tool bauen und brauche dazu Hilfe.

Meine GoPro Kamera hatte ein falsches Datum, deshalb kann ich die vielen Fotos und Videos nicht mit denen vom Handy richtig sortieren.
Ich muss die Stunden des Erstelldatums bei den Dateien, die mit GX.. anfangen um 2 Stunden korrigieren. Das Exiftool, was frei verfügbar ist, ist viel zu umständlich. Da habe ich mir ein kleines Tool gebaut, was aber nur zum Teil funktioniert.
PB hat die Datumstypen
#PB_Date_Created : gibt das Erstellungsdatum der Datei zurück
#PB_Date_Accessed: gibt das Datum des letzten Zugriffs auf die Datei zurück
#PB_Date_Modified: gibt das Datum der letzten Veränderung an der Datei zurück
eingebaut. mein Prog funktioniert aber nur mit Created und Modified, dort werden die Stunden korrigiert, bei Accessed werden aber die Tage modifiziert.
Frage 1: Warum ist das so?
Frage 2: Wie komme ich an das Datum, bei MP4 "Medium erstellt" und bei jpg "Aufnahmedatum"?
Im Windows Explorer kann man sich das einstellen und auch mit dem Exiftool auslesen, aber wie mache ich das in PB?

Es wäre schön, wenn mir da jemand helfen könnte, vielen Dank im voraus.
WIN 10 64 bit, PB 6.0 LTS
Dieter

Code: Alles auswählen

;Stundenschieber für Dateien die mit "GX"... beginnen
;TODO: man muss einen Pfad mit einer oder mehreren Dateien haben, die mit GX anfangen

EnableExplicit

#Mainwindow = 1

Enumeration : #Datgadg : #Pfad_Wahl : #Start_Button : #Ende_Button : #TxtGadg_Std_Korr
              #Pfad_Txt : #TxtGadg_Zeit : #combogadg_DaT_Art : #combogadg_DaT_Std
EndEnumeration

Define pfad$="C:\Temp\"
Define Ende
Global datum$ = FormatDate("%dd.%mm.%yyyy.%hh:%mm:%ss",Date())
Global datums_flag = #PB_Date_Created
Global shift_hour_flag = 0  ; Stundendifferenz (-2)-(-1)- 0 - (+1) -(+2)
Global DatumsWert           ; Zahlenwert Datum
Global DW_neu               ; Änderung mit Stundendifferenz



Procedure AendereDatum(Pfad$)
  Protected Zeit$, file$
  Protected gefunden

  gefunden = ExamineDirectory(#PB_Any, pfad$, "GX*.*") 
  If gefunden 
    While NextDirectoryEntry(gefunden) 
      If DirectoryEntryType(gefunden) = #PB_DirectoryEntry_File
         file$ = DirectoryEntryName(gefunden) 
          If Left(file$,2)= "GX" 
            file$ = pfad$ + file$ 
            DatumsWert = GetFileDate(file$,datums_flag)                       : Debug DatumsWert
            Zeit$ = FormatDate("%dd.%mm.%yyyy:%hh.%ii",Datumswert)            : Debug Zeit$   

            DW_neu = AddDate(DatumsWert,#PB_Date_Hour,shift_hour_flag)        : Debug DW_neu  ; neuer Zeitwert
            Zeit$ = FormatDate("%dd.%mm.%yyyy:%hh.%ii",DW_neu)                : Debug Zeit$   ; Neue Zeit
            DW_neu = DatumsWert + (3600 * shift_hour_flag)                    : Debug DW_neu  ; alternative Berechnung
            Zeit$ = FormatDate("%dd.%mm.%yyyy:%hh.%ii",DW_neu)                : Debug Zeit$   ; Ergebnis bei alternativer Berechnung
            SetFileDate(file$,datums_flag,ParseDate("%dd.%mm.%yyyy:%hh.%ii",zeit$))
            SetGadgetText(#TxtGadg_Zeit, Zeit$)                               : Debug Zeit$ 
          EndIf
      EndIf
    Wend
    FinishDirectory(gefunden)
 EndIf

EndProcedure

; --- Window
OpenWindow(#Mainwindow,0,0,200,250,"Dateidatum und Zeiten einstellen",
           #PB_Window_SystemMenu|#PB_Window_ScreenCentered)

  TextGadget(#TxtGadg_Std_Korr,5,10,190,25,"Stundenkorrektur")
  ComboBoxGadget(#combogadg_DaT_Art,5,35,190,25)
  AddGadgetItem(#combogadg_DaT_Art,0,"                 Zeit -2 Std")
  AddGadgetItem(#combogadg_DaT_Art,1,"                 Zeit -1 Std")
  AddGadgetItem(#combogadg_DaT_Art,2,"                 Zeit +/-0 Std")
  AddGadgetItem(#combogadg_DaT_Art,3,"                 Zeit +1 Std")
  AddGadgetItem(#combogadg_DaT_Art,4,"                 Zeit +2 Std")
  SetGadgetState(#combogadg_DaT_Art,2) 
  If #combogadg_DaT_Art = 7 
    GadgetToolTip(#combogadg_DaT_Art, "das Datum wird nicht verändert")
  EndIf
;   keine Korrektur, nicht verändert, es wird nur die Zeit ausgelesen
  
  TextGadget(#TxtGadg_Zeit,5,65,190,25,datum$,#PB_Text_Border|#PB_Text_Center)
  ComboBoxGadget(#combogadg_DaT_Std,5,95,190,25)
  AddGadgetItem(#combogadg_DaT_Std,0,"                Datum erstellt")
  AddGadgetItem(#combogadg_DaT_Std,1,"             Datum letzter Zugriff")
  AddGadgetItem(#combogadg_DaT_Std,2,"                Datum geändert")
;   AddGadgetItem(#combogadg_DaT_Std,3,"                Medium erstellt")
;   AddGadgetItem(#combogadg_DaT_Std,4,"                 Aufnahmedatum")

  SetGadgetState(#combogadg_DaT_Std,0)
  
  ButtonGadget(#Pfad_Wahl,5,125,190,30,"Pfad setzen")
  TextGadget(#Pfad_Txt,5,165,190,25,"",#PB_Text_Border|#PB_Text_Center) ; zeigt den Pfad
  SetGadgetText(#Pfad_Txt,Pfad$)
  ButtonGadget(#Start_Button,5,200,60,30,"Start")
  GadgetToolTip(#Start_Button, "startet einen Durchlauf, kann auch mehrfach betätigt werden") 
  ButtonGadget(#Ende_Button,135,200,60,30,"Ende")
  SetGadgetColor(#Ende_Button, #PB_Gadget_FrontColor, $0000FF)

  GadgetToolTip(#Ende_Button, "beendet das Programm") 
 


; --- Main -------------
Repeat
  Select WaitWindowEvent()    ;Fenster aufrufen und auf Ereignis warten
  Case #PB_Event_CloseWindow  ;Fenster schließen
    Ende=1
  
  Case #PB_Event_Gadget ; Ende-Taste drücken
    Select EventGadget()
    Case #Ende_Button
      Ende=1
      
  Case #Pfad_Wahl ;Ordner auswählen
      pfad$=PathRequester("Ordner wählen",pfad$)
      SetGadgetText(#Pfad_Txt,pfad$)

  Case #combogadg_DaT_Std ; Auswählen welche Zeitdaten korrigiert werden sollen
      Select GetGadgetState(#combogadg_DaT_Std)
       Case 0 : datums_flag = #PB_Date_Created:  ; gibt das Erstellungsdatum der Datei zurück
       Case 1 : datums_flag = #PB_Date_Accessed: ; gibt das Datum des letzten Zugriffs auf die Datei zurück
       Case 2 : datums_flag = #PB_Date_Modified: ; gibt das Datum der letzten Veränderung an der Datei zurück
;      Case 3 : datums_flag = #Medium erstellt    ; Bei MP4 
;      Case 4 : datums_flag = #Aufnahmedatum      ; Bei IPG

      EndSelect
    
  Case #combogadg_DaT_Art ; Auswählen um welche Anzahl die DW_neu korrigiert werden solle
      Select GetGadgetState(#combogadg_DaT_Art)
        Case 0 : shift_hour_flag =  -2
        Case 1 : shift_hour_flag =  -1
        Case 2 : shift_hour_flag =   0
        Case 3 : shift_hour_flag =   1
        Case 4 : shift_hour_flag =   2  
      EndSelect
      
      Case #Start_Button ; Zeitänderung starten
      AendereDatum(pfad$)
      
    EndSelect
  EndSelect
Until Ende
End 
Gruß aus Solingen, PB 6.0 Win 10 Pro
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Hilfe bei Zugriff auf Dateidatum

Beitrag von HeX0R »

Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Re: Hilfe bei Zugriff auf Dateidatum

Beitrag von dibro »

Ja, aber danke für den Hinweis.
Es ist nicht das, was ich suche. Es gibt auch viele fertige GUIs für das Exiftool, aber man muss jede Datei einzeln manipuiieren und kann da nicht in Serie machen. Ist mir auch zu kompliziert, das anzupassen - überschreitet meine Kenntnisse. Ich habe früher mal technisch-physikalische Probleme programmiert, keine Spiele und schon gar nicht solche speziellen Dateizugriffe.
Ich müsste auch wissen, wo was zu suchen ist, dann könnte man evtl. mit peek/poke arbeiten. Aber ich wollte vermeiden, alle Dateien zu öffnen sondern so auf die Eigenschaften zugreifen, wie es der Explorer macht
Zunächst wäre meine Frage 1 zu klären, bei PB_Date_Accesed verhält sich PB anders als bei z.B. _created. Das ist schon komisch, weil da bei der gleichen Routine nicht die Stunde, sondern der Tag geändert wird, was eigentlich auch der Doku widerspricht.
Ich gebe die Hoffnung nicht auf, dass mir da doch noch jemand aufs Pferd hilft.
Gruß aus Solingen, PB 6.0 Win 10 Pro
Axolotl
Beiträge: 279
Registriert: 31.12.2008 16:34

Re: Hilfe bei Zugriff auf Dateidatum

Beitrag von Axolotl »

Moin dibro,

also die AddDate() Funktion funktioniert bei mir fehlerfrei. (Siehe auch mein kleines Prof-of-Concept Progrämmchen).

Code: Alles auswählen

; Prof of Concept 
; 
Global file$ = "C:\Temp\GX_Test_00.bmp"  ; <-- use a valid filename here !!!  

Global dtc, dtm, dta 
Global HourValue 

Macro GetDates() 
  dtc = GetFileDate(file$, #PB_Date_Created)
  dtm = GetFileDate(file$, #PB_Date_Modified)
  dta = GetFileDate(file$, #PB_Date_Accessed)
EndMacro 

Macro SetDates() 
  SetFileDate(file$, #PB_Date_Created, dtc) 
  SetFileDate(file$, #PB_Date_Modified, dtm) 
  SetFileDate(file$, #PB_Date_Accessed, dta) 
EndMacro 

Macro DebugDates()   
Debug "  Date = " + 
      "   C = " + FormatDate("%dd.%mm.%yyyy:%hh.%ii", dtc) +
      " |  M = " + FormatDate("%dd.%mm.%yyyy:%hh.%ii", dtm) +
      " |  A = " + FormatDate("%dd.%mm.%yyyy:%hh.%ii", dta) 
EndMacro 

Macro AddHourValue() 
  dtc = AddDate(dtc, #PB_Date_Hour, HourValue) 
  dtm = AddDate(dtm, #PB_Date_Hour, HourValue) 
  dta = AddDate(dta, #PB_Date_Hour, HourValue) 
EndMacro 

; Get Dates and Add 2 Hours and Set Dates 
HourValue = 2 
GetDates() 
DebugDates() 
AddHourValue() 
DebugDates() 
SetDates() 

Debug "" 

; Get Dates and Add 2 Hours and Set Dates 
HourValue = -2 
GetDates() 
DebugDates() 
AddHourValue() 
DebugDates() 
SetDates() 

Warum das bei deinem Code nicht funzt?
Weiß auch (noch) nicht.

Meine Vermutung, dass es an der ExamineDirectory() Schleife liegt hat sich nicht bestätigt.
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Re: Hilfe bei Zugriff auf Dateidatum

Beitrag von dibro »

Moin, moin Axoloti,
danke für den Code, werde ich nachher probieren.
Ich habe noch eine andere Möglichkeit gefunden: Im EXIFTOOL gibt es die Möglichkeit, Daten zu verschieben bzw. zu kopieren, z.B. Medium_Created nach Date_Created, auch mit Wildcards. Dann geht das in einem Rutsch. Ich wühle mich gerade durch die Doku.
Dann kann ich anschließend problemlos die Zeit korrigieren, evtl. baue ich das Exiftool als Thread ein.
Muss auch mal erst feststellen, warum das ExifTool immer resident bleibt. Bisher räume ich es mit dem Manager weg - geht bestimmt auch anders. Also erst muss ich Doku lesen - leider in englisch, dadurch ein bisschen schwierig für mich.
Schöne Grüße
Gruß aus Solingen, PB 6.0 Win 10 Pro
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Re: Hilfe bei Zugriff auf Dateidatum

Beitrag von dibro »

.... Habe ich probiert, selbe Seltsamkeit wie bei mir
Ich weiß bloß nicht, wie man ein Bild einfügt.
Hier, was im Debugger steht:
E:\Zeit_Test\GX010087.MP4 Date = C = 27.09.2022:09.47 | M = 08.08.2022:23.14 | A = 05.10.2022:00.00
E:\Zeit_Test\GX010087.MP4 Date = C = 27.09.2022:11.47 | M = 09.08.2022:01.14 | A = 05.10.2022:02.00

E:\Zeit_Test\GX010087.MP4 Date = C = 27.09.2022:11.47 | M = 09.08.2022:01.14 | A = 05.10.2022:00.00
E:\Zeit_Test\GX010087.MP4 Date = C = 27.09.2022:09.47 | M = 08.08.2022:23.14 | A = 04.10.2022:22.00
Und im Explorer: ....................................................................................04.10.2022:22.00
Jeweils 2 Stunden addiert und wieder subtrahiert. Bei C und M klappt das, bei A nicht, da ist das ein Tag weniger. :-(
Gruß aus Solingen, PB 6.0 Win 10 Pro
Axolotl
Beiträge: 279
Registriert: 31.12.2008 16:34

Re: Hilfe bei Zugriff auf Dateidatum

Beitrag von Axolotl »

mmmh,
das ist komisch, da es bei mir richtig funktioniert. :oops:

Nochmal hingeguckt:
Prüfe doch mal die Rückgabewerte von SetFileDate(), die sollten 1 (Non-Zero) sein.
Weil: Die Zeile vor der Leerzeile sollte mit der Zeile nach der Leerzeile übereinstimmen, damit am Ende wieder das gleiche Datum rauskommt.

Grundsätzlich ist zwei Stunden weniger als 0:00 Uhr schon der vorherige Tag um 22:00 oder? :oops:
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Re: Hilfe bei Zugriff auf Dateidatum

Beitrag von dibro »

auch hmmmm
Bei C und M haut es hin, nur bei A nicht.
Mach ich morgen, danke
Gruß aus Solingen, PB 6.0 Win 10 Pro
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Re: Hilfe bei Zugriff auf Dateidatum

Beitrag von dibro »

@Axoloti
Ich habe nochmal mehrere Versuche gemacht, hier die letzte Debugger Ausgabe, nur 1 Std hinzugefügt

Accessed alt, vor setdate : 1665446400
E:\Zeit_Test\GX010087.MP4 Date = C = 18.07.2022:03.49 | M = 18.07.2022:03.49 | A = 11.10.2022:00.00
E:\Zeit_Test\GX010087.MP4 Date = C = 18.07.2022:04.49 | M = 18.07.2022:04.49 | A = 11.10.2022:01.00
Accessed neu, nach Setdate : 1665450000 11.10.2022:01.00
zum Schluss nochmals eingelesen, accessed #1665446400 Datum 11.10.2022:01.00
im Explorer bleibt die Stunde aber auf 00:00 und bei erneutem Aufruf fängt es wieder mit 00:00 an


Ich gebe auf und schmeiß das Accesdatum raus. Im Moment fräse ich mich durch die ExifTool Doku.
Auf der Kommandozeile klappt das aber prima, da schiebe ich das Erstelldatum das die Kamera speichert ain die 3 C/M/A auf die ich per Win Zugriff habe:
exiftool.exe -G1 -a -s -time:all GX01008*.MP4 =>> Zeiten auslesen
exiftool.exe "-filemodifydate<createdate" "-fileaccessdate<createdate" "-filecreatedate<createdate" GX01008*.MP4 =>> Zeiten kopieren
Ich melde mich nochmal, wenn ich das fertig habe.
Bisher danke für die Hilfe
Gruß aus Solingen, PB 6.0 Win 10 Pro
Antworten