Ordnerdatum & Dateidatum ändern

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
BSP
Beiträge: 201
Registriert: 01.02.2009 14:04

Ordnerdatum & Dateidatum ändern

Beitrag von BSP »

Hallo.
Weil soetwas nachgefragt wurde, möchte ich Euch mein kleines Programm
zum ändern / einstellen der Ordner & Dateizeiten vorstellen.
Ich hoffe, es gefällt und Ihr könnt etwas damit anfangen.

Noch einen Hinweis:
Manchmal werden vom Win- Explorer die Ordnerzeiten nicht richtig angezeigt,
obwohl laut Eigenschaftenfenster die Einstellungen übernommen wurden.
Dann müsst Ihr den Schreibschutz für den Ordner entfernen.
Danach sollte dann alles stimmen.

Gruß: Bernd

Code: Alles auswählen

EnableExplicit

#HWnd = 1

Enumeration
#Datgadg
#ChBGadg
#FAuswahlButt
#LosButt
#EndButt
#TxtGadg1
#TxtGadg2
#combogadg1
#combogadg2
EndEnumeration

Define pfad$="C:\Temp\";GetCurrentDirectory()
Define ende
Global datum$ = FormatDate("%dd.%mm.%yyyy",Date())
Global flag = #PB_Date_Created

Procedure SetFolderDate(sFolder.s,flag,Zeit)

  Protected fHandle.l
  Protected ftCreation.FILETIME
  Protected ftLastAccess.FILETIME
  Protected ftLastWrite.FILETIME
  Protected LocalFileTime.FILETIME
  Protected LocalSystemTime.SYSTEMTIME
 
  ; ggf. abschließenden Backslash hinzufügen
  If Right(sFolder, 1) <> "\" : sFolder = sFolder + "\" : EndIf
    
  fHandle = CreateFile_(sFolder, #GENERIC_READ | #GENERIC_WRITE, #FILE_SHARE_READ | #FILE_SHARE_WRITE,  0, #OPEN_EXISTING, #FILE_FLAG_BACKUP_SEMANTICS, 0)
  If fHandle <> -1 
    ; Zeitinformationen des Ordners auslesen
    If GetFileTime_(fHandle, ftCreation, ftLastAccess, ftLastWrite) <> 0 
    ; Eigene Zeiten in die Zeitstruktur eintragen
        With LocalSystemTime
          \wDay    = Day(zeit)
          \wMonth  = Month(zeit)
          \wYear   = Year(zeit)
          \wHour   = Hour(zeit)
          \wMinute = Minute(zeit)
          \wSecond = Second(zeit)
      EndWith
    ; und in eine Filezeit umwandeln
      SystemTimeToFileTime_(LocalSystemTime, LocalFileTime)
      Select flag
      Case #PB_Date_Created
        LocalFileTimeToFileTime_(LocalFileTime, ftCreation)
      Case #PB_Date_Accessed
        LocalFileTimeToFileTime_(LocalFileTime, ftLastAccess)
      Case #PB_Date_Modified
        LocalFileTimeToFileTime_(LocalFileTime, ftLastWrite)
      EndSelect
    ; Nun die neuen Zeiten eintragen
      SetFileTime_(fHandle, ftCreation, ftLastAccess, ftLastWrite)
    ; Verzeichnis schließen
      CloseHandle_ (fHandle)
    EndIf
  EndIf
EndProcedure

Procedure AendereDatum(Pfad$)
  Protected Zeit$ ,file$
  Protected ok
  
  If GetGadgetState(#combogadg1)=0 Or GetGadgetState(#combogadg1)=2
    zeit$=datum$+":"+FormatDate("%hh.%ii",Date())
    SetFolderDate(pfad$,flag,ParseDate("%dd.%mm.%yyyy:%hh.%ii",zeit$))
  EndIf
  
  ok = ExamineDirectory(#PB_Any, pfad$, "*.*") 
  If ok 
    While NextDirectoryEntry(ok)
      If DirectoryEntryType(ok) = #PB_DirectoryEntry_File
        If GetGadgetState(#combogadg1)=1 Or GetGadgetState(#combogadg1)=2
          zeit$=datum$+":"+FormatDate("%hh.%ii",Date())
          file$=pfad$+DirectoryEntryName(ok)
          SetFileDate(file$,flag,ParseDate("%dd.%mm.%yyyy:%hh.%ii",zeit$))
        EndIf
      Else
        If GetGadgetState(#ChBGadg)
          If Not (DirectoryEntryName(ok)="." Or DirectoryEntryName(ok)="..")
            file$=pfad$+DirectoryEntryName(ok)+"\"
            AendereDatum(file$)
          EndIf
        EndIf
      EndIf
    Wend
    FinishDirectory(ok)
  EndIf

EndProcedure

; --- Window
OpenWindow(#HWnd , 0,0,300,200,"Dateidatum einstellen",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)

TextGadget(#TxtGadg1,4,4,292,22,"Datum einstellen !")
ComboBoxGadget(#combogadg1,100,30,120,22)
  AddGadgetItem(#combogadg1,0,"Nur Ordner")
  AddGadgetItem(#combogadg1,1,"Nur Dateien")
  AddGadgetItem(#combogadg1,2,"Ordner + Dateien")
  SetGadgetState(#combogadg1,0)
DateGadget(#Datgadg,4,60,80,22,"%dd.%mm.%yyyy",Date())
ComboBoxGadget(#combogadg2,100,60,120,22)
  AddGadgetItem(#combogadg2,0,"Erstellungsdatum")
  AddGadgetItem(#combogadg2,1,"Letzter Zugriff")
  AddGadgetItem(#combogadg2,2,"Letzte Änderung")
  SetGadgetState(#combogadg2,0)
ButtonGadget(#FAuswahlButt,4,90,80,30,"Ordner")
CheckBoxGadget(#ChBGadg,100,92,200,22,"Unterordner einbeziehen")
TextGadget(#TxtGadg2,4,126,292,22,"",#PB_Text_Border|#PB_Text_Right)
  SetGadgetText(#TxtGadg2,Pfad$)
ButtonGadget(#LosButt,4,166,60,30,"Los")
ButtonGadget(#EndButt,216,166,80,30,"Ende")


; --- Hauptschleife
Repeat
  Select WaitWindowEvent()
  Case #PB_Event_CloseWindow
    ende=1
    
  Case #PB_Event_Gadget
    Select EventGadget()
    Case #EndButt
      ende=1
      
    Case #FAuswahlButt
      pfad$=PathRequester("Ordner wählen",pfad$)
      SetGadgetText(#TxtGadg2,pfad$)
    
    Case #combogadg2
      Select GetGadgetState(#combogadg2)
      Case 0 : flag = #PB_Date_Created
      Case 1 : flag = #PB_Date_Accessed
      Case 2 : flag = #PB_Date_Modified
      EndSelect
      
    Case #LosButt
      datum$=GetGadgetText(#Datgadg)
      AendereDatum(pfad$)
      
    EndSelect
  EndSelect
Until ende
End
PB 5.31 (x86) & (x64) Win10