Seite 1 von 1

Speichern einer Datei - Speicherdatum und Zeit manipulieren

Verfasst: 03.01.2006 13:42
von hiltwin
Hallo,

ich möchte gerne eine Datei so speichern, dass später mit dem Explorer dort jedesmal als Datum z.B. 20.05.2005 20:05 Uhr angezeigt wird, egal an welchem Datum die Speicherung tatsächlich erfolgte.

Ist das mit PB möglich?

Frdl. Gruss
Hiltwin

Verfasst: 03.01.2006 16:04
von ts-soft
Das kannste nur anschließend per API machen:
http://msdn.microsoft.com/library/defau ... letime.asp

Frohes neues noch ...

Verfasst: 03.01.2006 16:36
von hiltwin
.... aber Du weisst doch, dass ich von API in PB keine Ahnung hab :(

Ist das einfach zu realisieren, oder fordere ich hier mal wieder mehrere Manntage Arbeit ein? :wink:

Verfasst: 03.01.2006 16:41
von ts-soft
Dann Du gucken CodeArchiv: http://www.purearea.net/pb/CodeArchiv/F ... me&Date.pb
oder die Includes von jaPBe, FilePlus.pbi

Verfasst: 03.01.2006 20:50
von hiltwin
hm, da hab ich reingeschaut. das ist allerdings ja nur die abfrage, wann die letzte änderung gewesen ist. beim ändern von get in set hat sich nicht wirklich was bei mir getan auf der festplatte :freak:

Verfasst: 05.01.2006 18:48
von Shardik
Ein Beispiel für die Abänderung des Änderungsdatums einer Datei (wenn sie noch nicht besteht, wird sie leer angelegt):

Code: Alles auswählen

#Filename = "C:\Test.Dat"

#Day = 5
#Month = 1
#Year = 2005
#Hour = 9
#Minute = 45

Procedure SetFileToCustomTime(FileHandle.L)
  FileTime.FILETIME
  SystemTime.SYSTEMTIME

  SystemTime\wDay = #Day
  SystemTime\wMonth = #Month
  SystemTime\wYear = #Year

  If #Hour = 0 Or #Hour = 24
    SystemTime\wHour = 23
  Else
    SystemTime\wHour = #Hour - 1
  EndIf
  
  SystemTime\wMinute = #Minute

  ; ----- Zeit im Systemformat in das Dateiformat konvertieren

  If SystemTimeToFileTime_(@SystemTime, @FileTime) = #False
    ProcedureReturn #False
  EndIf

  ; ----- Änderungs-Datum und -Zeit der Datei abändern

  If SetFileTime_(FileHandle, 0, 0, @FileTime) = #False
    ProcedureReturn #False
  EndIf
  
  ProcedureReturn #True
EndProcedure


FileHandle.L

FileHandle = OpenFile(1, #Filename)

If FileHandle = #False
  MessageRequester("Fehler", "Die Datei '" + #Filename + "' konnte nicht mit Schreibzugriff geöffnet werdent!", #MB_ICONERROR)
Else
  If SetFileToCustomTime(FileHandle) = #False
    MessageRequester("Fehler", "Die Abänderung des Änderungsdatums der Datei '" + #Filename + "' ist gescheitert!", #MB_ICONERROR)
  Else
    MessageRequester("Info", "Die Abänderung des Änderungsdatums der Datei '" + #Filename + "' war erfolgreich!", #MB_ICONINFORMATION)
  EndIf
  
  CloseFile(1)
EndIf
Vielleicht kann mir aber auch bei dieser Gelegenheit jemand einen Tipp geben, wie man die lokale Zeit berücksichtigt. Wenn ich mit der API-Funktion SystemTimeToTzSpecificLocalTime_() die gewünschte Zeit auf Grund der aktuell einstellten Zeitzone in die lokale Zeit umwandele, dann werden 2 Stunden zu der gewünschten Zeit hinzuaddiert. Lasse ich es weg, wird 1 Stunde hinzuaddiert. Deshalb die unschöne Anpassung im Code durch Abziehen einer Stunde :wink:

Verfasst: 05.01.2006 18:55
von ts-soft
Diese beiden Proceduren von GPI könnten vielleicht hilfreich sein:

Procedure FileTimeToDate(*FT.FILETIME) ; - Convert API-Time-Format to PB-Date() [FilePlus.pbi]
   FileTimeToLocalFileTime_ (*FT.FILETIME,FT2.FILETIME)
   FileTimeToSystemTime_ (FT2,st.SYSTEMTIME)
   ProcedureReturn Date (st\wYear,st\wMonth,st\wDay,st\wHour,st\wMinute,st\wSecond)
EndProcedure
Procedure DateToFileTime( Date ,*FT.FILETIME) ; - Convert PB-Date() to API-Time-Format [FilePlus.pbi]
  st.SYSTEMTIME
  st\wYear= Year ( Date )
  st\wMonth= Month ( Date )
  st\wDayOfWeek= DayOfWeek ( Date )
  st\wDay= Day ( Date )
  st\wHour= Hour ( Date )
  st\wMinute= Minute ( Date )
  st\wSecond= Second ( Date )
   SystemTimeToFileTime_ (st,FT2.FILETIME)
   LocalFileTimeToFileTime_ (FT2,*FT)
EndProcedure

Verfasst: 10.01.2006 14:20
von Shardik
Ein verbessertes Code-Beispiel, das in jeder Zeitzone korrekt arbeiten sollte:

Code: Alles auswählen

#Filename = "C:\Test.Dat"

#Day = 5
#Month = 1
#Year = 2005
#Hour = 9
#Minute = 45

Procedure.B SetFileToCustomTime(FileHandle.L, Day.W, Month.W, Year.W, Hour.W, Minute.W)
  CustomTime.SYSTEMTIME
  LocalFileTime.FILETIME
  UTCFileTime.FILETIME

  ; ----- Gewünschte Zeit in SYSTEMTIME-Struktur eintragen
  
  CustomTime\wDay = Day
  CustomTime\wMonth = Month
  CustomTime\wYear = Year
  CustomTime\wHour = Hour
  CustomTime\wMinute = Minute

  ; ----- Zeit im Systemzeit-Format in das lokale Dateizeit-Format konvertieren

  If SystemTimeToFileTime_(@CustomTime, @LocalFileTime) = #False
    ProcedureReturn #False
  EndIf

  ; ----- Zeit im lokalen Dateizeit-Format in das UTC-Dateizeit-Format konvertieren

  If LocalFileTimeToFileTime_(@LocalFileTime, @UTCFileTime) = #False
    ProcedureReturn #False
  EndIf

  ; ----- Änderungs-Datum und -Zeit der Datei abändern

  If SetFileTime_(FileHandle, 0, 0, @UTCFileTime) = #False
    ProcedureReturn #False
  EndIf
  
  ProcedureReturn #True
EndProcedure


FileHandle.L = OpenFile(1, #Filename)

If FileHandle = #False
  MessageRequester("Fehler", "Die Datei '" + #Filename + "' konnte nicht mit Schreibzugriff geöffnet werdent!", #MB_ICONERROR)
Else
  If SetFileToCustomTime(FileHandle, #Day, #Month, #Year, #Hour, #Minute) = #False
    MessageRequester("Fehler", "Die Abänderung des Änderungsdatums der Datei '" + #Filename + "' ist gescheitert!", #MB_ICONERROR)
  Else
    MessageRequester("Info", "Die Abänderung des Änderungsdatums der Datei '" + #Filename + "' war erfolgreich!", #MB_ICONINFORMATION)
  EndIf
  
  CloseFile(1)
EndIf

dank euch beiden ...

Verfasst: 12.01.2006 19:42
von hiltwin
... funktioniert perfekt, wie ich es für meine zwecke benötige ;o)