Nur einen Teil von Created-FILETIME ändern

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Nur einen Teil von Created-FILETIME ändern

Beitrag von uweb »

Hallo,
nach etwas Sucherei, Copy&Paset, Anpassung und viel Grübelei brauche ich doch wieder einmal Hilfe.
Ich will, wie der Titel schon sagt, nur einen Teil von Created-FILETIME bei Dateien und Ordnern ändern.
Über die Jahreszahl will ich eine Markierung setzen und in den Millisekunden sollen Bit-Informationen untergebracht werden.
Danke im voraus!

Code: Alles auswählen

EnableExplicit


ProcedureDLL SetDir2STDate(File.s, *ST.SYSTEMTIME, Which)
  ; Return 1 If succes / 0 If fail
 
  ; Which specify wich time
  ; 0 = Time the File was created
  ; 1 = Time the file was last accessed
  ; 2 = Time the file was last written
  
  Protected handle, retour, FFT.FILETIME, FLT.FILETIME, FST.SYSTEMTIME
 
  ;handle=OpenFile (0, File)  
  handle=CreateFile_(@File,#GENERIC_READ,#FILE_SHARE_READ|#FILE_SHARE_WRITE,0,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL,0) 
  
  If handle<>#INVALID_HANDLE_VALUE
    
    GetFileTime_(handle,0,0,FFT.FILETIME)  
    
    FileTimeToLocalFileTime_(FFT.FILETIME,FLT.FILETIME) 
    FileTimeToSystemTime_(FLT.FILETIME,FST.SYSTEMTIME) 
    
    FST\wyear =*ST\wyear
    FST\wMilliseconds = *ST\wMilliseconds  
    
    SystemTimeToFileTime_(FST.SYSTEMTIME,FLT.FILETIME)
    LocalFileTimeToFileTime_(FLT.FILETIME,FFT.FILETIME) 
  
    Select Which
      Case 1
        retour=SetFileTime_(handle,0,FFT.FILETIME,0)
      Case 2
        retour=SetFileTime_(handle,0,0,FFT.FILETIME)
      Default
        retour=SetFileTime_(handle,FFT.FILETIME,0,0)
    EndSelect
   
    CloseHandle_(handle)
  EndIf
 
  If retour<>0 : retour=1 : EndIf
  ProcedureReturn retour
EndProcedure 


Define Event, Path.s, File.s, st.SYSTEMTIME

#DTM_SETSYSTEMTIME = $1002
#GDT_VALID = 0

GetSystemTime_(st.SYSTEMTIME)
st\wYear  = 1964
st\wMonth = 12
st\wDay   = 31
st\wMilliseconds=12345

If OpenWindow(0, 0, 0, 220, 260, "Create-Date 2 WF-Date", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CalendarGadget(0, 10, 10, 200, 180)
  ButtonGadget(1,  10, 200, 200,  20, "Select Folder")
  ButtonGadget(2,  10, 230, 200,  20, "Select File")

  SendMessage_(GadgetID(0), #DTM_SETSYSTEMTIME, #GDT_VALID, @st.SYSTEMTIME)
  
  Repeat
    Event = WaitWindowEvent()
          SendMessage_(GadgetID(0), #DTM_SETSYSTEMTIME, #GDT_VALID, @st.SYSTEMTIME)
    
    If Event = #PB_Event_Gadget

      Select EventGadget()
          
        Case 0
          SendMessage_(GadgetID(0), #DTM_SETSYSTEMTIME, #GDT_VALID, @st.SYSTEMTIME)
          
        Case 1
          Path = PathRequester("Select Folder to set Create-Date 1964", "C:\")
          If Not SetDir2STDate(Path,st,0) : MessageRequester("Error !", "42", #PB_MessageRequester_Ok) : EndIf

        Case 2
          File = OpenFileRequester("Select File to set Create-Date 1964", "", "(*.*)|*.*", 0)
          If Not SetDir2STDate(Path,st,0) : MessageRequester("Error !", "42", #PB_MessageRequester_Ok) : EndIf
          
      EndSelect

    EndIf

  Until Event = #PB_Event_CloseWindow

EndIf

End
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Nur einen Teil von Created-FILETIME ändern

Beitrag von Bisonte »

Nur eine Idee, aber eventuell liegt es daran, das die MSDN zu der SYSTEMTIME Struktur sagt :
wMilliseconds

The millisecond. The valid values for this member are 0 through 999.
Dein Wert dort ist leicht drüber mit den 12345....

Wären also 9 Bits (512) die man dort unterbringen könnte, wenn deine Theorie stimmt, bei 10 Bits muss man die Obergrenze etwas kappen (1024)...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: Nur einen Teil von Created-FILETIME ändern

Beitrag von uweb »

Mein Kompliment dafür, dass Du den Fehler nur durchs Lesen und Wissen gefunden hast.
Ich hätte durch wildes Herumprobieren dafür wahrscheinlich sehr lange gebraucht und mich anschließend wieder einmal über mich selbst geärgert.
Danke!

Beim gezielten Probieren habe ich aber festgestellt, dass es immer noch nicht läuft.
Ich vermute, dass die von mir verwendeten Codschnipsel nicht mehr aktuell sind oder ich noch ein anderes Detail nicht berücksichtigt habe.

Vielleich hat ja, jemand ein Codefragment herumliegen, dass mir zeigt wie es geht.
Andreas21
Beiträge: 390
Registriert: 30.08.2004 09:05
Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64
Wohnort: Heidelberg

Re: Nur einen Teil von Created-FILETIME ändern

Beitrag von Andreas21 »

Code: Alles auswählen

Define FFT.FILETIME
Define FST.SYSTEMTIME

GetSystemTime_(FST.SYSTEMTIME)

FST\wHour = 20
FST\wYear = 1980

SystemTimeToFileTime_(FST.SYSTEMTIME, FFT.FILETIME)

handel = OpenFile(0, "test.txt")
If IsFile(0)
  SetFileTime_(handel,0, FFT, 0)
  CloseFile(0)
EndIf
geht bei mir problemlos
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: Nur einen Teil von Created-FILETIME ändern

Beitrag von uweb »

Ja, bei mir auch.
Super, danke!

Das kommt davon wenn man es schön machen will, statt erst einmal eine Mini-Version zu nehmen.
Manchmal ....
Gut, dass es das Forum gibt!

PS
Ich wollte ja, den Teil von Created ändern :

Code: Alles auswählen

SetFileTime_(handel, FFT,0, 0)
Antworten