Speichern einer Datei - Speicherdatum und Zeit manipulieren

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
hiltwin
Beiträge: 311
Registriert: 06.10.2005 11:08
Wohnort: D-31177 Harsum
Kontaktdaten:

Speichern einer Datei - Speicherdatum und Zeit manipulieren

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Das kannste nur anschließend per API machen:
http://msdn.microsoft.com/library/defau ... letime.asp
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
hiltwin
Beiträge: 311
Registriert: 06.10.2005 11:08
Wohnort: D-31177 Harsum
Kontaktdaten:

Frohes neues noch ...

Beitrag 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:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Dann Du gucken CodeArchiv: http://www.purearea.net/pb/CodeArchiv/F ... me&Date.pb
oder die Includes von jaPBe, FilePlus.pbi
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
hiltwin
Beiträge: 311
Registriert: 06.10.2005 11:08
Wohnort: D-31177 Harsum
Kontaktdaten:

Beitrag 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:
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag 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:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag 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
hiltwin
Beiträge: 311
Registriert: 06.10.2005 11:08
Wohnort: D-31177 Harsum
Kontaktdaten:

dank euch beiden ...

Beitrag von hiltwin »

... funktioniert perfekt, wie ich es für meine zwecke benötige ;o)
Antworten