Seite 1 von 1

Nur einen Teil von Created-FILETIME ändern

Verfasst: 02.01.2014 21:09
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

Re: Nur einen Teil von Created-FILETIME ändern

Verfasst: 03.01.2014 10:10
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)...

Re: Nur einen Teil von Created-FILETIME ändern

Verfasst: 03.01.2014 13:40
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.

Re: Nur einen Teil von Created-FILETIME ändern

Verfasst: 03.01.2014 16:48
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

Re: Nur einen Teil von Created-FILETIME ändern

Verfasst: 03.01.2014 17:09
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)