ReadProgramString

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Re: ReadProgramString

Beitrag von dibro »

@mk-soft
Danke für die Tipps.
Das mit dem roten Rahmen habe ich geändert, Framegadget habe ich vor 15 Jahren schon mal verwendet, aber vergessen.
Das blaue Rändchen an den Buttons gefällt mir gut, aus optischen Gründen habe ich den Parameter #PB_Text_Center in 1 geändert.
Mit dem Pfad hatte ich schon ausprobiert, lasse das aber trotzdem so stehen, wenn das Datumsprogi auf einer SD-Karte oder einem Stick mit den Videos zusammen mit dem Exiftool läuft, dann hinterlässt es keine Spuren auf dem PC. Ich brauche das ja nicht oft, nur um die Videos zeitmäßig zu sortieren, wenn Kameras unterschiedliche oder falsche Zeiteinstellungen haben, UTC oder MEZ.
Viele Grüße
Dieter
28.11.2022 Der Vollständigkeit halber hier die Version bei der die Einstellungen ins Home-Verzeichnis geschrieben werden.
ich selber werde weiterhin die Prefs-Datei ins aktuelle Verzeichnis schreiben.
Nochnmals danke und eine besinnliche Adventszeit.
Viele Grüße Dieter

Code: Alles auswählen

;---Prolog---
;MEXDatum: Modifiziere EXif-Datum von Video-Dateien mit EXiftool für Windows.

;Gelungen unter Mithilfe und Codeschnipseln von Axolotl und mk-soft, 
;außerdem habe ich mich bei "ReadProgramString" von Jürgen Kulow bedient.
;Pb 6.0 28. Nov. 2022
;Exiftool Download auf https://exiftool.org/ getestet mit Version 12.45
;Parameter Exiftoool:
;exiftool.exe "-filemodifydate<createdate"  "-filecreatedate<createdate" *.MP4 =>> Zeiten kopieren
;exiftool.exe "-filemodifydate<createdate"  "-filecreatedate<createdate"  G*.MP4 
; -------------------------------------------------------------------------------------------------------
;----Top---

EnableExplicit
;-Konstanten
Enumeration Gadgets 
  #Mainwindow 
  #Button_Pfad_Wahl                     ; Pfadwahl 
  #Button_Start_Datumsaenderung         ; Start Zeit ändern 
  #Button_Ende_Prgr                     ; Programmende 
  #Button_Exif_Start                    ; Start ExifTool
  #Button_Exif_Verzeichnis_suchen       ; Verzeichnis mit dem ExifTool
  #combogadg_DaT_Art                    ; Erstell- /  Änderungddatum
  #combogadg_DaT_Std                    ; Anzahl Stundenverschiebung 
  #Combogadget_Datei_Wildcards          ; Dateiart Wildcards  einstellen G*.MP4 / *.MP4 / *.* 
  #EDGadget_Text_Ausgabe                ; Anzeige Exifverzeichnis
  #Rahmen1
  #Rahmen2
  #TxtGadg_Std_Korr                     ; Anzeige der Stundenkorrektur
  #Textgadget_Arbeistsverzeichnis       ; Zeigt den Pfad an 
  #TxtGadget_Zeit                       ; Zeigt die aktuelle Dateizeit 
  #TextGadget_Exif_Pfad                 ; Anzeige ExifPfad 
  #ProzessbarGadget
  #CheckboxSticky
  #Verzeichnis
EndEnumeration


;-Texte
  #TxtRunProgLaufzeit      =  "Laufzeit "
  #TxtZeiteinheit$         =  " ms"
  #TxtRunPrgOK$            =  "OK"
  #TxtRunPrgError$         =  "Fehler Nr.: "
  #TxtRunPrgFATAL$         =  "Fataler Fehler "
  #TxtProg_nicht_gefunden$  = "Programm nicht gefunden: "
  #NewLine=#CRLF$          ;Windows neue Zeile
  #HomeVerzeichnis = "Meine_Programme"
  #ApplicationName = "MEXDatum"

;-Structur
  Structure Pfade
    Exif_Pfad$                    ; Pfad zum ExifTool einschließlich #EXIF_Executable$
    EXIF_Executable$              ; "ExifTool.exe"
    Exif_Kommando$                ; Exiftool Parameter
    Arbeitsverzeichnis$           ; Arbeitsverzeichnnis mit den Dateien
    Datei_Parameter$              ; Wildcards G*.MP4, *.MP4, *.MOV
    Thread.i
  EndStructure
  
;-Globale Variablen  
  Global Parameter.Pfade 
;   Global Path$
  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 Ausgabe_Txt$         ; "Datenausgabe"
  Global Top = 5 
  Global Hoehe = 30
  Global Event, fertig.i , ready.i
  Global Ende.i, i.i

Declare ExifRun(*Parameter)
Declare AendereDatum()

;----Proceduren---
Procedure InitWildcards()
  Protected State.i
  With Parameter
  State = GetGadgetState(#Combogadget_Datei_Wildcards)
  If State = 0 : \Datei_Parameter$ = "G*.MP4" : EndIf
  If State = 1 : \Datei_Parameter$ = "*.MP4"  : EndIf
  If State = 2 : \Datei_Parameter$ = "*.MOV"  : EndIf
  EndWith
EndProcedure

Procedure InitThread()
  Protected Pfad$, ArbVerz$
  Pfad$ = GetGadgetText(#TextGadget_Exif_Pfad)
  ArbVerz$ = GetGadgetText(#Textgadget_Arbeistsverzeichnis)
   With Parameter      
     \Exif_Pfad$          = Pfad$ 
     \EXIF_Executable$    = "ExifTool.exe"
     \Exif_Kommando$      = " -filemodifydate<createdate" + " -filecreatedate<createdate "
     \Arbeitsverzeichnis$ = ArbVerz$
     \Thread               = CreateThread(@ExifRun(),@Parameter)
     EndWith 
EndProcedure

  


Procedure ExifRun(*Parameter)
  
  Protected Exitcode, NoErrText
  Protected NewErrorText$, AllErrorText$ =""
  Protected start = ElapsedMilliseconds()
  Protected Program.i
  Protected path$, Cmd$, WorkDir$, WildCard$, Ausgabe$
  Protected Flags =#PB_Program_Open | #PB_Program_Read | #PB_Program_Error | #PB_Program_Hide ;| #PB_Program_Wait
  
  With Parameter
    path$      = \Exif_Pfad$ + \EXIF_Executable$
    Cmd$       = \Exif_Kommando$  
    WorkDir$   = \Arbeitsverzeichnis$
    WildCard$ = \Datei_Parameter$            
  EndWith 
  cmd$ = Cmd$ + WorkDir$ + WildCard$
  
  ClearGadgetItems(#EDGadget_Text_Ausgabe)
  Ausgabe_Txt$ = ""
  Program = RunProgram(path$, Cmd$, WorkDir$, Flags) 
    
  If Program    
    DisableWindow(#Mainwindow,#True)  ; Keine Eingaben möglich, während das Exiftool läuft
    While ProgramRunning(Program) 
      If AvailableProgramOutput(Program)                  
        Ausgabe$ = " ExifTool: " + ReadProgramString(Program) + #NewLine 
      EndIf
        NewErrorText$=ReadProgramError(Program) 
      While NewErrorText$<>""
        NoErrText+1
        AllErrorText$ + Str(NoErrText)+":"+NewErrorText$+#NewLine
        NewErrorText$=ReadProgramError(Program) 
      Wend 
      i = i+2 : SetGadgetState   (#ProzessbarGadget, i) : Delay(50)
      If i => 100 : i= 0 : EndIf
    Wend
    Ausgabe$+" "+#TxtRunProgLaufzeit+": "+Str(ElapsedMilliseconds()-start)+#TxtZeiteinheit$+#NewLine  
    If ElapsedMilliseconds()-start    
      Exitcode=ProgramExitCode(Program)
      If Exitcode<>0
        If 0=Exitcode 
          Ausgabe$ =  Ausgabe$+#TxtRunPrgOK$ 
        Else   
          Ausgabe$ =  "Fehler "+Ausgabe$ + #TxtRunPrgError$ + Str(Exitcode) + " keine Datei gefunden "  + #NewLine ;
          Ausgabe$ =  Ausgabe$ + " " + AllErrorText$ 
        EndIf 
      EndIf

    Else 
      If 0<>IsProgram(Program) 
        KillProgram(Program)
        CloseProgram(Program)
        Ausgabe$ +" " + #NewLine +AllErrorText$  
      EndIf 
    EndIf 
     i = 0
     Ausgabe_Txt$ = Ausgabe$
     SetGadgetState   (#ProzessbarGadget, i)
     CloseProgram(Program)
           AddGadgetItem(#EDGadget_Text_Ausgabe,-1,Ausgabe_Txt$+#NewLine)

  Else
    MessageRequester(#TxtRunPrgFATAL$,#TxtProg_nicht_gefunden$+" "+ path$) 
  EndIf
    DisableWindow(#Mainwindow,#False)
    SetGadgetState(#combogadg_DaT_Art,2)       ;TODO diese 2 Zeilen entfallen, wenn die Zeit 
    shift_hour_flag = 0                        ;anschließen nach dem ExiTool korrigiert werden soll
    AendereDatum()     
  ProcedureReturn 
EndProcedure



Procedure AendereDatum()
   
  Protected Zeit$, Pfad$
  Protected ArbVerz$, Para$
  Protected DatumsWert.i, DW_neu.i, gefunden.i, IstDatei.i
  
  With Parameter
    ArbVerz$ = \Arbeitsverzeichnis$
    Para$    = \Datei_Parameter$
  EndWith 
  IstDatei = 0
  gefunden = ExamineDirectory(#PB_Any,ArbVerz$,Para$) 
  If gefunden 
      While NextDirectoryEntry(gefunden) 
        If DirectoryEntryType(gefunden) = #PB_DirectoryEntry_File
            Para$ = DirectoryEntryName(gefunden) 
            If FileSize(Pfad$) =  FileSize(Para$) 
              Para$ = ArbVerz$ + Para$ 
              DatumsWert = GetFileDate(Para$,datums_flag)                     
              Zeit$ = FormatDate("%dd.%mm.%yyyy:%hh.%ii",Datumswert)              
              DW_neu = AddDate(DatumsWert,#PB_Date_Hour,shift_hour_flag)        
              Zeit$ = FormatDate("%dd.%mm.%yyyy:%hh.%ii",DW_neu)               
              DW_neu = DatumsWert + (3600 * shift_hour_flag)                   
              Zeit$ = FormatDate("%dd.%mm.%yyyy:%hh.%ii",DW_neu)               
              SetFileDate(Para$,datums_flag,ParseDate("%dd.%mm.%yyyy:%hh.%ii",zeit$))
              SetGadgetText(#TxtGadget_Zeit, Zeit$)                              
              Ausgabe_Txt$ = Para$ + " " + Zeit$
              AddGadgetItem(#EDGadget_Text_Ausgabe, -1, Ausgabe_Txt$ ) ;+#NewLine
            EndIf
            IstDatei = 1
        Else
          Ausgabe_Txt$  = Para$+ " Datei nicht gefunden," +  #NewLine + "Arbeitsverzeichnis korrekt gesetzt?"
          AddGadgetItem(#EDGadget_Text_Ausgabe, -1, Ausgabe_Txt$ + #NewLine)
        EndIf  
      Wend
   If Not    NextDirectoryEntry(gefunden) And IstDatei = 0
        Ausgabe_Txt$  = Para$+ " Datei nicht gefunden" + #NewLine + "Arbeitsverzeichnis korrekt gesetzt?"
        AddGadgetItem(#EDGadget_Text_Ausgabe, -1, Ausgabe_Txt$ + #NewLine)
        SetGadgetText(#TxtGadget_Zeit, "Heute " + FormatDate("%dd.%mm.%yyyy %hh:%ii", Date()) )
    EndIf   
    
  EndIf 
      FinishDirectory(gefunden)
EndProcedure


  Procedure Tooltipp() 
  If shift_hour_flag =   0
     GadgetToolTip(#combogadg_DaT_Art, "das Datum wird nicht verändert")  
  ElseIf  shift_hour_flag = -1
           GadgetToolTip(#combogadg_DaT_Art, "")
         EndIf  
EndProcedure
       
Procedure.s GetProgramDataPath()
  Protected basePath.s, subPath.s, dataPath.s 
    basePath = GetUserDirectory(#PB_Directory_ProgramData)
    subPath = basePath + #HomeVerzeichnis + #PS$
  dataPath = subPath + #ApplicationName + #PS$
  If FileSize(dataPath) <> -2
    If FileSize(subPath) <> -2
      CreateDirectory(subPath)
    EndIf
    If FileSize(dataPath) <> -2
      CreateDirectory(dataPath)
    EndIf
  EndIf
  ProcedureReturn dataPath
EndProcedure

Procedure InitHilfeTxT()
   Ausgabe_Txt$ = " Das ExifTool von von Phil Harvey muss auf dem Rechner installiert sein " + #NewLine +
                 " ------------------------------------------"                   + #NewLine +
                 " 1. Pfade setzen "        + #NewLine +
                 " 2. Dateiart wählen "     + #NewLine +
                 " 3. ExifTool starten "    + #NewLine +
                 " 4. Zeitänderung wählen " + #NewLine +
                 " 5. Zeit starten "        + #NewLine +
                 " 6. Freuen "              + #NewLine +
                 "------------------------------------------"                   + #NewLine +
                 " Das Programm speichert die aktuellen Einstellungen in einer MEXDatum.pref " + #NewLine +
                 " Die Funktionen Start und ExifTool können mehrfach aufgerufen werden " + #NewLine +
                 " Der Button ExifTool setzt die Änderungen Im FileDate wieder zurück auf das Erstelldatum der Kamera."
 
  SetGadgetText(#EDGadget_Text_Ausgabe,Ausgabe_Txt$)

EndProcedure

Procedure  Lese_Pref()
  Protected Pfad$
  Pfad$=GetProgramDataPath()
  If Pfad$
    If OpenPreferences(Pfad$ + "MEXDatum.pref")    ;  liest oder erstellt eine Preference-Datei namens MEXDatum.pref
      PreferenceGroup("Global")
      With Parameter                       ; initialisiere
        \Exif_Pfad$                 = ReadPreferenceString("Exif_Pfad$","")
        \EXIF_Executable$           = ReadPreferenceString("Exif_Executable$","")
        \Exif_Kommando$             = ReadPreferenceString("Exif_Kommando$","")
        \Arbeitsverzeichnis$        = ReadPreferenceString("Arbeitsverzeichnis$","")
      EndWith
      ClosePreferences()
    Else
      CreatePreferences("MEXDatum.pref")
      ClosePreferences()
    EndIf
  EndIf 
EndProcedure
; ----------------------------------
 Procedure Schreibe_Pref() ; Preferenzdatei schreiben
   Protected Pfad$
   Pfad$ = GetProgramDataPath()
   If Pfad$
    OpenPreferences(Pfad$ + "MEXDatum.pref")
    PreferenceGroup("Global")
    With Parameter
      WritePreferenceString("Exif_Pfad$",         \Exif_Pfad$)
      WritePreferenceString("Exif_Executable$",   \EXIF_Executable$)
      WritePreferenceString("Exif_Kommando$",     \Exif_Kommando$)
      WritePreferenceString("Arbeitsverzeichnis$",\Arbeitsverzeichnis$)
    EndWith
    ClosePreferences() 
  EndIf
EndProcedure

;-MainWindow
 

  OpenWindow(#Mainwindow,             0,0,500,420,"MEXDatum = Modifiziere EXif-Datum mit dem Exiftool von Phil Harvey",
             #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  Lese_Pref()
  StickyWindow(#Mainwindow,#True)
  TextGadget(#TxtGadg_Std_Korr,     10,Top+10,180,20,"Datum lesen, Zeit ändern",#PB_Text_Center) : Top =Top + 30
  ComboBoxGadget(#combogadg_DaT_Art,10,Top,180,30) : Top = Top + 40
  AddGadgetItem(#combogadg_DaT_Art,0,"Zeit -2 Std")
  AddGadgetItem(#combogadg_DaT_Art,1,"Zeit -1 Std")
  AddGadgetItem(#combogadg_DaT_Art,2,"Datum +/-0 Std")
  AddGadgetItem(#combogadg_DaT_Art,3,"Zeit +1 Std")
  AddGadgetItem(#combogadg_DaT_Art,4,"Zeit +2 Std")
  SetGadgetState(#combogadg_DaT_Art,2) 
  If GetGadgetState(#combogadg_DaT_Art) = 2
    GadgetToolTip(#combogadg_DaT_Art, "das Datum wird nicht verändert")
  EndIf
;   keine Korrektur, nicht verändert, es wird nur die Zeit ausgelesen
  
  ComboBoxGadget(#combogadg_DaT_Std,10,Top,180,30)    : Top = Top + 40                          
  AddGadgetItem(#combogadg_DaT_Std,0,"Setzen: Datum erstellt")
  AddGadgetItem(#combogadg_DaT_Std,1,"Setzen: Datum geändert")
  SetGadgetState(#combogadg_DaT_Std,0)
  GadgetToolTip(#combogadg_DaT_Std,"Wählt welches Datum korrigiert werden soll")
  TextGadget(#TxtGadget_Zeit,         10,Top,180,30,datum$,#PB_Text_Border|#PB_Text_Center) : Top = Top + 40
  SetGadgetText(#TxtGadget_Zeit, "Heute " + FormatDate("%dd.%mm.%yyyy %hh:%ii", Date()))
  ButtonGadget(#Button_Pfad_Wahl,          10,Top,180,30,"Setzen: Arbeitsverzeichnis",1) : Top = Top + 40 ; ButtonGadget mit blauem Rand :-)
  TextGadget  (#Textgadget_Arbeistsverzeichnis,           10,Top,180,35,"",#PB_Text_Border|#PB_Text_Center) : Top = Top + 45 ; zeigt den Pfad  
  SetGadgetText(#Textgadget_Arbeistsverzeichnis,Parameter\Arbeitsverzeichnis$)
  GadgetToolTip(#Button_Pfad_Wahl,"Wählt dasArbeitsverzeichnis mit den Dateien")
  
  ComboBoxGadget(#Combogadget_Datei_Wildcards,10, Top, 180, Hoehe) : Top = Top+40
  AddGadgetItem(#Combogadget_Datei_Wildcards,0,"Gopro: G* . MP4")
  AddGadgetItem(#Combogadget_Datei_Wildcards,1,"Video:  * . MP4")
  AddGadgetItem(#Combogadget_Datei_Wildcards,2,"Video:  * . MOV")

  SetGadgetState(#Combogadget_Datei_Wildcards,0)
  If GetGadgetState(#Combogadget_Datei_Wildcards) = 0 : Parameter\Datei_Parameter$ =  "G*.MP4": EndIf 
  
  ButtonGadget(#Button_Exif_Verzeichnis_suchen,   10,Top,180,30,"Setzen: Exifverzeichnis",1) : Top = Top + 40 
  GadgetToolTip(#Button_Exif_Verzeichnis_suchen, "Stellt das Verzeichnis mit dem ExifTool ein") 
  
  TextGadget(#TextGadget_Exif_Pfad,       10,Top,180,30,"",#PB_Text_Border|#PB_Text_Center) : Top = Top + 65 ; zeigt den Pfad  
  SetGadgetText(#TextGadget_Exif_Pfad,Parameter\Exif_Pfad$)
  
  
  ButtonGadget(#Button_Start_Datumsaenderung,       10, Top, 120, 30,"Start: Zeit",1) 
  GadgetToolTip(#Button_Start_Datumsaenderung, "startet einen Durchlauf, kann auch mehrfach betätigt werden") 
  ButtonGadget(#Button_Exif_Start,        270,Top,120,30,"Exiftool",1) 
  GadgetToolTip(#Button_Exif_Start, "startet das ExifTool") 

  ButtonGadget(#Button_Ende_Prgr,        140,Top,120,30,"Ende",1); ,#PB_Text_Center
  SetGadgetColor(#Button_Ende_Prgr, #PB_Gadget_BackColor, $000FF)
  GadgetToolTip(#Button_Ende_Prgr, "beendet das Programm") 

  ProgressBarGadget(#ProzessbarGadget,  10, Top -15, 480,  8, 0, 100)
  CheckBoxGadget(#CheckboxSticky, 400, Top , 100, 20, "Fenster oben")
  SetGadgetState(#CheckboxSticky,1)
  If #CheckboxSticky = 1 : StickyWindow(#Mainwindow,#True) : EndIf 
  
  EditorGadget(#EDGadget_Text_Ausgabe,          205,8,285, 355,#PB_Editor_ReadOnly|#PB_Editor_WordWrap)
  FrameGadget(#Rahmen1, 5, 5, 190, 360,"",#PB_Frame_Double)
  FrameGadget(#Rahmen2,202, 5, 290, 360,"",#PB_Frame_Double)
  InitHilfeTxT()
  
  Lese_Pref()

;----RepeatSchleife ---
  Repeat 
    Event = WaitWindowEvent()
  Select Event      ;auf Ereignis im Window warten
    Case #PB_Event_CloseWindow  ;Fenster schließen
      Ende=1
    Case #PB_Event_Gadget ; Ende-Taste drücken
      Select EventGadget()
    Case #Button_Ende_Prgr
      Ende=1
  ;- wähle Arbeitsordner     
    Case #Button_Pfad_Wahl 
      With Parameter
      \Arbeitsverzeichnis$=PathRequester("Arbeitsordner wählen",\Arbeitsverzeichnis$)
      SetGadgetText(#Textgadget_Arbeistsverzeichnis,\Arbeitsverzeichnis$)
      InitWildcards()
      EndWith
  ;- wähle Exif-Pfad 
    Case #Button_Exif_Verzeichnis_suchen                    
      With Parameter
     \Exif_Pfad$= PathRequester("ExifTool Pfad wählen", \Exif_Pfad$)
      SetGadgetText(#TextGadget_Exif_Pfad,\Exif_Pfad$)
      InitWildcards()
    EndWith
 ;- FileDate wählen
    Case #combogadg_DaT_Std                         
      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_Modified:  ; gibt das Änderungsdatum der Datei zurück
      EndSelect
 ;- wähle Stunden+/- 
    Case #combogadg_DaT_Art                         
      Select GetGadgetState(#combogadg_DaT_Art)   ; das Datum korrigiert werden soll
        Case 0 : shift_hour_flag =  -2 : Tooltipp() 
        Case 1 : shift_hour_flag =  -1 : Tooltipp()
        Case 2 : shift_hour_flag =   0 : Tooltipp()
        Case 3 : shift_hour_flag =   1 : Tooltipp()
        Case 4 : shift_hour_flag =   2 : Tooltipp()
      EndSelect
  ;-wähle Parameter 
    Case #Combogadget_Datei_Wildcards             ; Auswählen welche Dateien korrigiert werden sollen
      With Parameter            
        Select GetGadgetState(#Combogadget_Datei_Wildcards)
          Case 0 : \Datei_Parameter$ =  "G*.MP4"
          Case 1 : \Datei_Parameter$ =  "*.MP4"
          Case 2 : \Datei_Parameter$ =  "*.MOV"
        EndSelect 
        InitWildcards()
      EndWith 
    
 ;- Start Datumsänderung            
    Case #Button_Start_Datumsaenderung 
        ClearGadgetItems(#EDGadget_Text_Ausgabe) 
        AendereDatum()
        
;- ExifTool Start        
    Case #Button_Exif_Start ; Exif Datum nach Filedatum verschieben
        If Not IsThread(Parameter\Thread)        
          InitWildcards()
          InitThread()
      Else
        MessageRequester("Info", "Thread läuft noch!")
      EndIf       
    Case   #CheckboxSticky 
       StickyWindow(#Mainwindow, GetGadgetState(#CheckboxSticky) )
     Case #PB_Event_CloseWindow :  End
    EndSelect
  EndSelect
Until Ende
  Schreibe_Pref()
  End
;----Bottom---

      
  
Gruß aus Solingen, PB 6.0 Win 10 Pro
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ReadProgramString

Beitrag von mk-soft »

GetProgramDataPath() verstellt. So ist das nicht richtig.
Es landet immer noch im %APPDATA% Verzeichnis vom Benutzer. Aber mit falschen Ordner Namen!

Wenn du es im Home Verzeichnis haben möchtest, dann

Code: Alles auswählen

path.s = GetHomeDirectory()
Debug path

path.s = GetUserDirectory(#PB_Directory_Documents)
Debug path
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Axolotl
Beiträge: 146
Registriert: 31.12.2008 16:34

Re: ReadProgramString

Beitrag von Axolotl »

dibro hat geschrieben: 28.11.2022 11:23 ...
28.11.2022 Der Vollständigkeit halber hier die Version bei der die Einstellungen ins Home-Verzeichnis geschrieben werden.
ich selber werde weiterhin die Prefs-Datei ins aktuelle Verzeichnis schreiben.
Nochnmals danke und eine besinnliche Adventszeit.
Viele Grüße Dieter

Schön wenn alles so funktioniert wie du es haben möchtest.
Aus meiner Sicht schadet es wohl nicht, wenn Du nochmal über den Code gehst und die ein oder andere "Verbesserung" vornimmst.
TIPP: Einrückungen sind dein Freund, wenn du sie richtig nutzt.
Hier empfehle ich STRG+I (bei selektierem Codebereich) um den Code nachträglich "schön" zu machen.
Ich glaube, dass das auch beim Programmieren hilft.

Zur grundsätzlichen Anwendung von Verzeichnissen möchte ich nichts mehr schreiben. Allerdings wird die "MEXDatum.pref" Datei ohne Pfad (also im aktuellen Verzeichnis beim Programmaufruf) erzeugt, wenn sie noch nicht als Pfad$+"MEXDatum.pref" existiert.

Wenn ich das exif Tool richtig verstanden habe, könntest du die Datumsänderung auch vollständig vom Tool erledigen lassen. Dann muss dein Programm nur den richtigen Parameter-String zusammenbauen...

So, jetzt ist aber gut....
Ich wünsche Dir (und allen Mitlesenden) ebenfalls eine besinnliche Adventszeit.
Mostly running 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: ReadProgramString

Beitrag von dibro »

Danke für die Tipps,
ich werde mir das nochmal zu Gemühte führen.
Ich habe aber noch ein paar andere Probleme, Windows macht im Explorer, in dem ich die Video-Dateien letztlich nach Datum und Zeit sortieren will, was es will und nicht was ich will:
Hier am Beispiel einer Datei:
GX010110.MP4 Zeit laut Bahnhofsuhr im Bild 21:27

Im Explorer steht unter Datum 23:27 und Erstelldatum 21:27

ExifTool sagt
File Modification Date/Time : 2022:07:15 21:27:48+02:00
File Creation Date/Time : 2022:07:15 21:27:47+02:00
---
Create Date : 2022:07:15 21:27:47
Modify Date : 2022:07:15 21:27:47
---


Mit dem meinem Progi
GX010110.MP4 Erstelldatum 15.07.2022:20.27

+ 1 Stunde dazu addiert:
GX010110.MP4 15.07.2022:21.27 ---> die korrekte Zeit

Im ExifTool steht dann:
File Creation Date/Time : 2022:07:15 22:27:00+02:00, was nicht korrekt ist.

Der Explorer zeigt nach wie vor Datum 23:27

Nur die Änderung der Zeitzone um 2 Stunden führt dann zur korrekten Zeit im Explorer unter Datum.
Irgenwie verwirrend :o
Im Grunde kann ich die Zeit nicht nach meinen Vorstellungen beeinflussen.
Und noch etwas: Bei 40 GB Videos im Verzeichnis steigt das Exiftool mit Fehlermeldungen aus, bis 10 Dateien habe ich probiert, da läuft es noch.
Dass die von mir ausgelesene Zeit nicht mit derjenigen übereinstimmt, die in den Exifdaten steht, stört mich irgendwie.
Ich habe das alles mit dem Debugger kontrolliert, es bleibt komisch.

Schöne Grüße und ebenfalls eine besinnliche Adventszeit.
Dieter

Update an Nikolaus 6.12.2022

Jetzt aber ein letztes Mal in diesem Jahr :D
Ich denke, jetzt funktioniert alles, die Ergänzungen habe ich in den Einführungstext geschrieben.
Ausprobiert habe ich es in einem Verzeichnis mit ca. 400 MP4 und MOV-Dateien.
Leere Dateien und mehr als 11 Zeichen im Verzeichnisname mag das Exiftool nicht.
Jetzt macht es das, was ich möchte.
Vielen Dank für die Hilfestellungen.
Dieter

Code: Alles auswählen

;---Prolog---
;MEXDatum: Modifiziere EXif-Datum von Video-Dateien mit EXiftool für Windows.

;Gelungen unter Mithilfe und Codeschnipseln von Axolotl und mk-soft, 
;außerdem habe ich mich bei "ReadProgramString" von Jürgen Kulow bedient.
;Pb 6.0 Nov. 2022
;Exiftool Download auf https://exiftool.org/ getestet mit Version 12.45
;Parameter Exiftoool:
;exiftool.exe "-filemodifydate<createdate -filecreatedate<createdate"  *.MP4  =>> Zeiten kopieren
;exiftool.exe "-filemodifydate<createdate -filecreatedate<createdate"  G*.MP4 
; -------------------------------------------------------------------------------------------------------
;----Top---

EnableExplicit
;-Konstanten
Enumeration Gadgets 
  #Mainwindow 
  #Button_Pfad_Wahl                     ; Pfadwahl 
  #Button_Start_Datumsaenderung         ; Start Zeit ändern 
  #Button_Ende_Prgr                     ; Programmende 
  #Button_Exif_Start                    ; Start ExifTool
  #Button_Exif_Verzeichnis_suchen       ; Verzeichnis mit dem ExifTool
  #combogadg_DaT_Art                    ; Erstell- /  Änderungddatum
  #combogadg_DaT_Std                    ; Anzahl Stundenverschiebung 
  #Combogadget_Datei_Wildcards          ; Dateiart Wildcards  einstellen G*.MP4 / *.MP4 / *.MOV 
  #EDGadget_Text_Ausgabe                ; Anzeige Exifverzeichnis
  #Rahmen1
  #Rahmen2
  #TxtGadg_Std_Korr                     ; Anzeige der Stundenkorrektur
  #Textgadget_Arbeistsverzeichnis       ; Zeigt den Pfad an 
  #TxtGadget_Zeit                       ; Zeigt die aktuelle Dateizeit 
  #TextGadget_Exif_Pfad                 ; Anzeige ExifPfad 
  #ProzessbarGadget
  #CheckboxSticky
  #Verzeichnis
EndEnumeration


;-Texte
  #TxtRunProgLaufzeit      =  "Laufzeit "
  #TxtZeiteinheit$         =  " ms"
  #TxtRunPrgOK$            =  "OK"
  #TxtRunPrgError$         =  "Fehler Nr.: "
  #TxtRunPrgFATAL$         =  "Fataler Fehler "
  #TxtProg_nicht_gefunden$  = "Programm nicht gefunden: "
  #NewLine=#CRLF$          ;Windows neue Zeile

;-Structur
  Structure Pfade
    Exif_Pfad$                    ; Pfad zum ExifTool einschließlich #EXIF_Executable$
    EXIF_Executable$              ; "ExifTool.exe"
    Exif_Kommando$                ; Exiftool Parameter
    Arbeitsverzeichnis$           ; Arbeitsverzeichnnis mit den Dateien
    Datei_Parameter$              ; Wildcards G*.MP4, *.MP4, *.MOV
    Thread.i
  EndStructure
  
;-Globale Variablen  
Global Parameter.Pfade 
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 Ausgabe_Txt$         ; "Datenausgabe"
Global Top = 5 
Global Hoehe = 30
Global Event, fertig.i , ready.i
Global Ende.i, i.i

Declare ExifRun(*Parameter)
Declare AendereDatum()

;----Proceduren---
Procedure InitWildcards()
  Protected State.i
  With Parameter
  State = GetGadgetState(#Combogadget_Datei_Wildcards)
  If State = 0 : \Datei_Parameter$ = "G*.MP4" : EndIf
  If State = 1 : \Datei_Parameter$ = "*.MP4"  : EndIf
  If State = 2 : \Datei_Parameter$ = "*.MOV"  : EndIf
  EndWith
EndProcedure

Procedure InitThread()
  Protected Pfad$, ArbVerz$
  Pfad$ = GetGadgetText(#TextGadget_Exif_Pfad)
  ArbVerz$ = GetGadgetText(#Textgadget_Arbeistsverzeichnis)
   With Parameter      
     \Exif_Pfad$          = Pfad$ 
     \EXIF_Executable$    = "ExifTool.exe"
     \Exif_Kommando$      = " -filemodifydate<createdate -filecreatedate<createdate "
     \Arbeitsverzeichnis$ = ArbVerz$
     \Thread               = CreateThread(@ExifRun(),@Parameter)
     EndWith 
EndProcedure

  


Procedure ExifRun(*Parameter)
  
  Protected Exitcode, NoErrText
  Protected NewErrorText$, AllErrorText$ =""
  Protected start = ElapsedMilliseconds()
  Protected Program.i
  Protected path$, Cmd$, WorkDir$, WildCard$, Ausgabe$
  Protected Flags =#PB_Program_Open | #PB_Program_Read | #PB_Program_Error | #PB_Program_Hide ;| #PB_Program_Wait
  
  With Parameter
    path$      = \Exif_Pfad$ + \EXIF_Executable$
    Cmd$       = \Exif_Kommando$  
    WorkDir$   = \Arbeitsverzeichnis$
    WildCard$ = \Datei_Parameter$            
  EndWith 
    cmd$ = Cmd$ + WorkDir$ + WildCard$
    ClearGadgetItems(#EDGadget_Text_Ausgabe)
    Program = RunProgram(path$, Cmd$, WorkDir$, Flags) 
    
  If Program    
      DisableWindow(#Mainwindow,#True)  ; Keine Eingaben möglich, während das Exiftool läuft
    While ProgramRunning(Program) 
      If AvailableProgramOutput(Program)                  
        Ausgabe$ = Cmd$ + #NewLine + " ExifTool: " + ReadProgramString(Program) + #NewLine 
      EndIf
        NewErrorText$=ReadProgramError(Program) 
      While NewErrorText$<>""
        NoErrText+1
        AllErrorText$ + Str(NoErrText)+":"+NewErrorText$+#NewLine
        NewErrorText$=ReadProgramError(Program) 
      Wend 
        i = i+2 : SetGadgetState   (#ProzessbarGadget, i) : Delay(50)
        If i => 100 : i= 0 : EndIf
    Wend
      Ausgabe$+" "+#TxtRunProgLaufzeit+": "+Str(ElapsedMilliseconds()-start)+#TxtZeiteinheit$+#NewLine  
    If ElapsedMilliseconds()-start    
      Exitcode=ProgramExitCode(Program)
      If Exitcode<>0
        If 0=Exitcode 
          Ausgabe$ =  Ausgabe$+#TxtRunPrgOK$ 
        Else   
          Ausgabe$ =  "Fehler "+Ausgabe$ + #TxtRunPrgError$ + Str(Exitcode) + " keine Datei gefunden "  + #NewLine ;
          Ausgabe$ =  Ausgabe$ + " " + AllErrorText$ 
        EndIf 
      EndIf

    Else 
      If 0<>IsProgram(Program) 
        KillProgram(Program)
        CloseProgram(Program)
        Ausgabe$ +" " + #NewLine +AllErrorText$  
      EndIf 
    EndIf 
     i = 0
     Ausgabe_Txt$ = Ausgabe$
     SetGadgetState   (#ProzessbarGadget, i)
     CloseProgram(Program)
           AddGadgetItem(#EDGadget_Text_Ausgabe,-1,Ausgabe_Txt$+#NewLine)

  Else
    MessageRequester(#TxtRunPrgFATAL$,#TxtProg_nicht_gefunden$+" "+ path$) 
  EndIf
    DisableWindow(#Mainwindow,#False)
    SetGadgetState(#combogadg_DaT_Art,2)       ;TODO diese 2 Zeilen entfallen, wenn die Zeit 
    shift_hour_flag = 0                        ;anschließen nach dem ExiTool korrigiert werden soll
    AendereDatum()     
  ProcedureReturn 
EndProcedure



Procedure AendereDatum()
   
  Protected Zeit$, Pfad$
  Protected ArbVerz$, Para$
  Protected DatumsWert.i, DW_neu.i, gefunden.i, IstDatei.i, Zeitzone.i = 1
  
  With Parameter
    ArbVerz$ = \Arbeitsverzeichnis$
    Para$    = \Datei_Parameter$
  EndWith 
  IstDatei = 0
  gefunden = ExamineDirectory(#PB_Any,ArbVerz$,Para$) 
  If gefunden 
      While NextDirectoryEntry(gefunden) 
        If DirectoryEntryType(gefunden) = #PB_DirectoryEntry_File
            Para$ = DirectoryEntryName(gefunden) 
            If FileSize(Pfad$) =  FileSize(Para$) 
              Para$ = ArbVerz$ + Para$ 
              DatumsWert = GetFileDate(Para$,datums_flag)                
              DW_neu = AddDate(DatumsWert,#PB_Date_Hour,shift_hour_flag)        
              Zeit$ = FormatDate("%dd.%mm.%yyyy:%hh.%ii",DW_neu)              
              DW_neu = DatumsWert + (3600 * shift_hour_flag)     ;kürzer als AddDate(              
              Zeit$ = FormatDate("%dd.%mm.%yyyy:%hh.%ii",DW_neu)                
              SetFileDate(Para$,datums_flag,ParseDate("%dd.%mm.%yyyy:%hh.%ii",zeit$))
              DW_neu = DW_neu + 3600 * Zeitzone  ; für die Anzeige eine Stunde addieren, Windows zeigt sonst die UTC an
              Zeit$ = FormatDate("%dd.%mm.%yyyy:%hh.%ii",DW_neu) ; Datum für die Anzeige im ED-Gadget
              SetGadgetText(#TxtGadget_Zeit, Zeit$)                            
              Ausgabe_Txt$ = Para$ + " " + Zeit$
              AddGadgetItem(#EDGadget_Text_Ausgabe, -1, Ausgabe_Txt$ ) ;+#NewLine
            EndIf
            IstDatei = 1
        Else
          Ausgabe_Txt$  = Para$+ " Datei nicht gefunden," +  #NewLine + "Arbeitsverzeichnis korrekt gesetzt?"
          AddGadgetItem(#EDGadget_Text_Ausgabe, -1, Ausgabe_Txt$ + #NewLine)
        EndIf  
      Wend
   If Not    NextDirectoryEntry(gefunden) And IstDatei = 0
        Ausgabe_Txt$  = Para$+ " Datei nicht gefunden" + #NewLine + "Arbeitsverzeichnis korrekt gesetzt?"
        AddGadgetItem(#EDGadget_Text_Ausgabe, -1, Ausgabe_Txt$ + #NewLine)
        SetGadgetText(#TxtGadget_Zeit, "Heute " + FormatDate("%dd.%mm.%yyyy %hh:%ii", Date()) )
    EndIf   
    
  EndIf 
      FinishDirectory(gefunden)
EndProcedure


  Procedure Tooltipp() 
  If shift_hour_flag =   0
     GadgetToolTip(#combogadg_DaT_Art, "das Datum wird nicht verändert")  
  ElseIf  shift_hour_flag = -1
           GadgetToolTip(#combogadg_DaT_Art, "")
  EndIf  
EndProcedure

Procedure InitHilfeTxT()
  Ausgabe_Txt$ = " Das ExifTool von von Phil Harvey muss auf dem Rechner installiert sein " + #NewLine +
                 " ------------------------------------------"                   + #NewLine +
                 " 1. Pfade setzen "        + #NewLine +
                 " 2. Dateiart wählen "     + #NewLine +
                 " 3. ExifTool starten "    + #NewLine +
                 " 4. Zeitänderung wählen " + #NewLine +
                 " 5. Zeit starten "        + #NewLine +
                 " 6. Freuen "              + #NewLine +
                 "------------------------------------------"                   + #NewLine +
                 " Das Programm speichert die aktuellen Einstellungen in einer MEXDatum.pref " + #NewLine +
                 " Die Funktionen Start und ExifTool können mehrfach aufgerufen werden " + #NewLine +
                 " Der Button ExifTool setzt die Änderungen im FileDate wieder zurück auf das Datum der Kamera."+ #NewLine +
                 " ACHTUNG: Das Exiftool mag keine Verzeichnisse mit mehr als 11 Zeichen !"+ #NewLine +
                 " Es sollten auch keine Unterverzeichnisse und leere Dateien enthalten sein " + #NewLine +
                 " Für die Anzeige wird 1 Std hinzuaddiert, weil Windows immer eine Stunde für die MEZ abzieht"
 
  SetGadgetText(#EDGadget_Text_Ausgabe,Ausgabe_Txt$)

EndProcedure

Procedure Lese_Pref()
   Protected Pfad$
  Pfad$ = GetHomeDirectory()
  If Pfad$
    If OpenPreferences("MEXDatum.pref")    ;  liest oder erstellt eine Preference-Datei namens MEXDatum.pref
      PreferenceGroup("Global")
      With Parameter                       ; initialisiere
        \Exif_Pfad$                 = ReadPreferenceString("Exif_Pfad$","")
        \EXIF_Executable$           = ReadPreferenceString("Exif_Executable$","")
        \Exif_Kommando$             = ReadPreferenceString("Exif_Kommando$","")
        \Arbeitsverzeichnis$        = ReadPreferenceString("Arbeitsverzeichnis$","")
      EndWith
      ClosePreferences()
    Else
      CreatePreferences("MEXDatum.pref")
      ClosePreferences()
    EndIf
  EndIf 
EndProcedure
; ----------------------------------
 Procedure Schreibe_Pref() ; Preferenzdatei schreiben
   Protected Pfad$
    Pfad$ = GetHomeDirectory()
  If Pfad$
      OpenPreferences("MEXDatum.pref")
      PreferenceGroup("Global")
    With Parameter
      WritePreferenceString("Exif_Pfad$",         \Exif_Pfad$)
      WritePreferenceString("Exif_Executable$",   \EXIF_Executable$)
      WritePreferenceString("Exif_Kommando$",     \Exif_Kommando$)
      WritePreferenceString("Arbeitsverzeichnis$",\Arbeitsverzeichnis$)
    EndWith
    ClosePreferences() 
  EndIf
EndProcedure

;-MainWindow
 

  OpenWindow(#Mainwindow,             0,0,500,420,"MEXDatum = Modifiziere EXif-Datum mit dem Exiftool von Phil Harvey",
             #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  Lese_Pref()
  StickyWindow(#Mainwindow,#True)
  TextGadget(#TxtGadg_Std_Korr,     10,Top+10,180,20,"Datum lesen, Zeit ändern",#PB_Text_Center) : Top =Top + 30
  ComboBoxGadget(#combogadg_DaT_Art,10,Top,180,30) : Top = Top + 40
  AddGadgetItem(#combogadg_DaT_Art,0,"Zeit -2 Std")
  AddGadgetItem(#combogadg_DaT_Art,1,"Zeit -1 Std")
  AddGadgetItem(#combogadg_DaT_Art,2,"Datum +/-0 Std")
  AddGadgetItem(#combogadg_DaT_Art,3,"Zeit +1 Std")
  AddGadgetItem(#combogadg_DaT_Art,4,"Zeit +2 Std")
  SetGadgetState(#combogadg_DaT_Art,2) 
  If GetGadgetState(#combogadg_DaT_Art) = 2
    GadgetToolTip(#combogadg_DaT_Art, "das Datum wird nicht verändert")
  EndIf
;   keine Korrektur, nicht verändert, es wird nur die Zeit ausgelesen
  
  ComboBoxGadget(#combogadg_DaT_Std,10,Top,180,30)    : Top = Top + 40                          
  AddGadgetItem(#combogadg_DaT_Std,0,"Setzen: Datum erstellt")
  AddGadgetItem(#combogadg_DaT_Std,1,"Setzen: Datum geändert")
  SetGadgetState(#combogadg_DaT_Std,0)
  GadgetToolTip(#combogadg_DaT_Std,"Wählt welches Datum korrigiert werden soll")
  TextGadget(#TxtGadget_Zeit,         10,Top,180,30,datum$,#PB_Text_Border|#PB_Text_Center) : Top = Top + 40
  SetGadgetText(#TxtGadget_Zeit, "Heute " + FormatDate("%dd.%mm.%yyyy %hh:%ii", Date()))
  ButtonGadget(#Button_Pfad_Wahl,          10,Top,180,30,"Setzen: Arbeitsverzeichnis",1) : Top = Top + 40 ;,#PB_Text_Center
  TextGadget  (#Textgadget_Arbeistsverzeichnis,           10,Top,180,35,"",#PB_Text_Border|#PB_Text_Center) : Top = Top + 45 ; zeigt den Pfad  
  SetGadgetText(#Textgadget_Arbeistsverzeichnis,Parameter\Arbeitsverzeichnis$)
  GadgetToolTip(#Button_Pfad_Wahl,"Wählt dasArbeitsverzeichnis mit den Dateien")
  
  ComboBoxGadget(#Combogadget_Datei_Wildcards,10, Top, 180, Hoehe) : Top = Top+40
  AddGadgetItem(#Combogadget_Datei_Wildcards,0,"Gopro: G* . MP4")
  AddGadgetItem(#Combogadget_Datei_Wildcards,1,"Video:  * . MP4")
  AddGadgetItem(#Combogadget_Datei_Wildcards,2,"Video:  * . MOV")

  SetGadgetState(#Combogadget_Datei_Wildcards,0)
  If GetGadgetState(#Combogadget_Datei_Wildcards) = 0 : Parameter\Datei_Parameter$ =  "G*.MP4": EndIf 
  
  ButtonGadget(#Button_Exif_Verzeichnis_suchen,   10,Top,180,30,"Setzen: Exifverzeichnis",1) : Top = Top + 40 ;,#PB_Text_Center
  GadgetToolTip(#Button_Exif_Verzeichnis_suchen, "Stellt das Verzeichnis mit dem ExifTool ein") 
  
  TextGadget(#TextGadget_Exif_Pfad,       10,Top,180,30,"",#PB_Text_Border|#PB_Text_Center) : Top = Top + 65 ; zeigt den Pfad  
  SetGadgetText(#TextGadget_Exif_Pfad,Parameter\Exif_Pfad$)
  
  
  ButtonGadget(#Button_Start_Datumsaenderung,       10, Top, 120, 30,"Start: Zeit",1) 
  GadgetToolTip(#Button_Start_Datumsaenderung, "startet einen Durchlauf, kann auch mehrfach betätigt werden") 
  ButtonGadget(#Button_Exif_Start,        270,Top,120,30,"Exiftool",1) 
  GadgetToolTip(#Button_Exif_Start, "startet das ExifTool") 

  ButtonGadget(#Button_Ende_Prgr,        140,Top,120,30,"Ende",1); ,#PB_Text_Center
  SetGadgetColor(#Button_Ende_Prgr, #PB_Gadget_BackColor, $000FF)
  GadgetToolTip(#Button_Ende_Prgr, "beendet das Programm") 

  ProgressBarGadget(#ProzessbarGadget,  10, Top -15, 480,  8, 0, 100)
  CheckBoxGadget(#CheckboxSticky, 400, Top , 100, 20, "Fenster oben")
  SetGadgetState(#CheckboxSticky,1)
  If #CheckboxSticky = 1 : StickyWindow(#Mainwindow,#True) : EndIf 
  
  EditorGadget(#EDGadget_Text_Ausgabe,          205,8,285, 355,#PB_Editor_ReadOnly|#PB_Editor_WordWrap)
  FrameGadget(#Rahmen1, 5, 5, 190, 360,"",#PB_Frame_Double)
  FrameGadget(#Rahmen2,202, 5, 290, 360,"",#PB_Frame_Double)
  InitHilfeTxT()
  
  Lese_Pref()

;----RepeatSchleife ---
  Repeat 
    Event = WaitWindowEvent()
  Select Event      ;auf Ereignis im Window warten
    Case #PB_Event_CloseWindow  ;Fenster schließen
      Ende=1
    Case #PB_Event_Gadget ; Ende-Taste drücken
      Select EventGadget()
    Case #Button_Ende_Prgr
      Ende=1
  ;- wähle Arbeitsordner     
    Case #Button_Pfad_Wahl 
      With Parameter
      \Arbeitsverzeichnis$=PathRequester("Arbeitsordner wählen",\Arbeitsverzeichnis$)
      SetGadgetText(#Textgadget_Arbeistsverzeichnis,\Arbeitsverzeichnis$)
      InitWildcards()
      EndWith
  ;- wähle Exif-Pfad 
    Case #Button_Exif_Verzeichnis_suchen                    
      With Parameter
     \Exif_Pfad$= PathRequester("ExifTool Pfad wählen", \Exif_Pfad$)
      SetGadgetText(#TextGadget_Exif_Pfad,\Exif_Pfad$)
      InitWildcards()
    EndWith
 ;- FileDate wählen
    Case #combogadg_DaT_Std                         
      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_Modified:  ; gibt das Änderungsdatum der Datei zurück
      EndSelect
 ;- wähle Stunden+/- 
    Case #combogadg_DaT_Art                         
      Select GetGadgetState(#combogadg_DaT_Art)   ; das Datum korrigiert werden soll
        Case 0 : shift_hour_flag =  -2 : Tooltipp() 
        Case 1 : shift_hour_flag =  -1 : Tooltipp()
        Case 2 : shift_hour_flag =   0 : Tooltipp()
        Case 3 : shift_hour_flag =   1 : Tooltipp()
        Case 4 : shift_hour_flag =   2 : Tooltipp()
      EndSelect
  ;-wähle Parameter 
    Case #Combogadget_Datei_Wildcards             ; Auswählen welche Dateien korrigiert werden sollen
      With Parameter            
        Select GetGadgetState(#Combogadget_Datei_Wildcards)
          Case 0 : \Datei_Parameter$ =  "G*.MP4"
          Case 1 : \Datei_Parameter$ =  "*.MP4"
          Case 2 : \Datei_Parameter$ =  "*.MOV"
        EndSelect 
        InitWildcards()
      EndWith 
    
 ;- Start Datumsänderung            
    Case #Button_Start_Datumsaenderung 
        ClearGadgetItems(#EDGadget_Text_Ausgabe) 
        AendereDatum()
        
;- ExifTool Start        
    Case #Button_Exif_Start ; Exif Datum nach Filedatum verschieben
        If Not IsThread(Parameter\Thread)        
          InitWildcards()
          InitThread()
      Else
        MessageRequester("Info", "Thread läuft noch!")
      EndIf       
    Case   #CheckboxSticky 
       StickyWindow(#Mainwindow, GetGadgetState(#CheckboxSticky) )
     Case #PB_Event_CloseWindow :  End
    EndSelect
  EndSelect
Until Ende
  Schreibe_Pref()
  End
;----Bottom---

  
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: ReadProgramString

Beitrag von dibro »

Ein frohes Neues Jahr allerseits.
Ich brauche mal wieder Hilfe. Warum funktioniert das nicht?
Ich will das Erstelldatum vor den Dateinamen setzen. Das klappt soweit. Aber den neuen Namen anschließend auslesen funktioniert nicht.
Der alte Name wird wiederholt, obwohl im Explorer der neue stehl. Bei erneutem Aufruf des Filerequesrters findet er den alten Namen nicht mehr.
Was mache ich falsch?
Danke für die Hilfe

Code: Alles auswählen

 If FileSize(Pfad$) =  FileSize(File$)
              SetCurrentDirectory(ArbVerz$)
              DatumsWert = GetFileDate(File$,datums_flag)                           
              Zeit$ = FormatDate("%yyyy%mm_%hh%ii",DatumsWert)
              If RenameFile(File$,Zeit$+"_"+File$)
                 NewFileName$ = GetFilePart(File$) 
              Else  
                  MessageRequester( "Info ","Umbenennung nicht möglich",#PB_MessageRequester_Ok )
              EndIf
               Ausgabe_Txt$ = NewFileName$ + " " + Zeit$
              AddGadgetItem(#EDGadget_Text_Ausgabe, -1, Ausgabe_Txt$ ) ;+#NewLine
            EndIf
Gruß Dieter
Gruß aus Solingen, PB 6.0 Win 10 Pro
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: ReadProgramString

Beitrag von jacdelad »

Dein Code ist nicht lauffähig. Ich weiß nicht ob es jemand anderes tut, aber ich kann/will dir erst helfen, wenn du einen lauffähigen Code, der das Problem abbildet, postest.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Axolotl
Beiträge: 146
Registriert: 31.12.2008 16:34

Re: ReadProgramString

Beitrag von Axolotl »

Ja, bei dem Code-Schnippsel kann man nicht wirklich helfen....
Vermutungen:
a) wenn File$ den gesamten Pfad enthält, dann steht die Zeit vor dem Pfad.
b) wenn File$ nicht den Pfad enthält verstehe ich die nachfolgende Zeile (NewFileName$ = GetFilePart(File$) ) nicht.
c) wahrscheinlich arbeitest du mit dem Pfad ArbVerz$, hier sollte dann auch die neue Datei stehen.
d) was meinst du mit "Der alte Name wird wiederholt"?

P.S.: Es macht Sinn bei neuen Themen ein neues Topic zu starten. Dann passt auch der Titel zum Thema.
Mostly running 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: ReadProgramString

Beitrag von dibro »

Hi,
ich habe mal schnell ein lauffähiges Beispiel gebastelt.
Darin benenne ich die eine Datei um (xyz.MP4) und anschließend soll das Erstelldatum vor dem Dateinamen stehen.
Das tut es auch. Nur wenn ich zur Kontrolle den Dateinamen sofort wieder auslese, dann steht da immer noch der alte Name, obwohl das Umbenennen geklappt hat, wie man dann im Explorer oder bei erneutem Aufruf der Datei sehen kann. Das ist mir rätselhaft.

Code: Alles auswählen

   StandardFile$ = "C:\temp"  
  Pattern$ = "Alle Dateien (*.*)|*.*"
  File$ = OpenFileRequester("Bitte Datei zum Laden auswählen", StandardFile$, Pattern$,0)
  If File$                                                                           :Debug "File$ komplett " + File$
    MessageRequester("Information", "Sie haben folgende Datei ausgewählt:" + Chr(10) + File$, 0)
  Else
    MessageRequester("Information", "Der Requester wurde abgebrochen.", 0) 
  EndIf
  SetCurrentDirectory(GetPathPart(File$))
  DatumsWert = GetFileDate(File$,#PB_Date_Modified)        : Debug "Zahlenwert des Datums " + Datumswert
   File$ = GetFilePart(File$)                                                  :Debug "File$ nur Datei " + File$
   Zeit$ = FormatDate("%yyyy%mm_%hh%ii",DatumsWert)  : Debug "Datum und Zeit " + Zeit$
   newFile$ = Zeit$+File$                                                     : Debug  "newFile$ " + newFile$
   If   RenameFile(File$,newFile$)                                                                              
        Debug "Umbenennen erfolgreich."
        Debug "neuer Dateiname " + GetFilePart(File$) 
  Else 
    Debug "Umbenennen fehlgeschlagen."  
  EndIf
Gruß Dieter
Gruß aus Solingen, PB 6.0 Win 10 Pro
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: ReadProgramString

Beitrag von HeX0R »

File$ wurde ja auch nie geändert
Axolotl
Beiträge: 146
Registriert: 31.12.2008 16:34

Re: ReadProgramString

Beitrag von Axolotl »

Ich würde sagen, dass diese Ausgabe in Zeile 10 nicht richtig ist:

Code: Alles auswählen

        Debug "neuer Dateiname " + GetFilePart(File$) 
Wenn Du es auf folgendes änderst, sollte die Ausgabe richtig sein:

Code: Alles auswählen

        Debug "neuer Dateiname " + GetFilePart(newFile$)  ; <== ?? 

Ich denke, dass hat HeXOR gemeint.

?? .. Eigentlich braucht hier kein GetFilePart() zu stehen, Du hast vorher ja schon den Pfad entsorgt und nutzt hier das SetCurrentDirectory()
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
Antworten