Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Bestimmtes Datum als Änderungsdatum einer Datei setzen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
steini



Anmeldungsdatum: 17.09.2004
Beiträge: 58

BeitragVerfasst am: 06.05.2014, 15:43    Titel: Bestimmtes Datum als Änderungsdatum einer Datei setzen Antworten mit Zitat

Hallo allerseits,
ich suche nach einer Möglichkeit, ein beliebiges Datum (hier: 24.12.2013, 12 Uhr) als Änderungsdatum einer Datei zu setzen. Für sämtliche Datums, die der aktuellen Zeitzone (Sommerzeit) entsprechen, klappt das auch. Das Beispieldatum liegt jedoch in der Winterzeit, als Ergebnis wird deshalb immer 11:00:00 anstelle der gewollten 12:00:00 angezeigt.
Das Problem ist, dass LocalFileTimeToFileTime offensichtlich zwar den aktuellen Zeitunterschied (2 Stunden zur UTC) berücksichtigt, nicht jedoch, dass das zu setzende Datum in der Winterzeit und damit in einer um eine Stunde abweichenden Zeitzone liegt. Kennt jemand eine andere Möglichkeit, so dass mir in den Dateieigenschaften 12 und nicht 11 Uhr angezeigt werden?


Code:
#INCLUDE ONCE "vbcompat.bi"
#INCLUDE ONCE "Windows.bi"

FUNCTION filehandel2( fname As String ) As HANDLE
  Dim OFS As OFSTRUCT
  OFS.cBytes = Len( OFS )
  Function = Cast( HANDLE, OpenFile( fname, @OFS, OF_READWRITE ))
End FUNCTION

Function Serial2FTime( datser As Double ) As FILETIME
  Dim As SYSTEMTIME sTime
  Dim As FILETIME fTime, fTime2
  sTime.wYear   = Year  ( datser )
  sTime.wMonth  = Month ( datser )
  sTime.wDay    = Day   ( datser )
  sTime.wHour   = Hour  ( datser )
  sTime.wMinute = Minute( datser )
  sTime.wSecond = Second( datser )
  SystemTimeToFileTime( @sTime, @fTime )
  LocalFileTimeToFileTime( @fTime, @fTime2 )
  Function = fTime2
End FUNCTION

DIM AS INTEGER f=FREEFILE
OPEN "test.txt" FOR OUTPUT AS #f: CLOSE #f
DIM AS HANDLE FileHdl3
DIM As FILETIME lwTime
DIM As Double datv
FileHdl3 = FILEHANDEL2("test.txt")
datv = DateValue("24.12.2013") + TimeValue("12:00:00") 'Liegt in Winterzeit
'datv = DateValue("24.05.2013") + TimeValue("12:00:00") 'Liegt in Sommerzeit
lwtime = Serial2FTime( datv )
SetFileTime FileHdl3, @lwTime, NULL, @lwTime
CloseHandle( FileHdl3)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 06.05.2014, 16:06    Titel: Re: Bestimmtes Datum als Änderungsdatum einer Datei setzen Antworten mit Zitat

Do könntest versuchen folgende Funktionsreihenfolge zu verwenden.

FileTimeToSystemTime
SystemTimeToTzSpecificLocalTime
SystemTimeToFileTime
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
steini



Anmeldungsdatum: 17.09.2004
Beiträge: 58

BeitragVerfasst am: 06.05.2014, 16:30    Titel: Antworten mit Zitat

Damit erhalte ich 14 Uhr. So geht's also leider nicht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 06.05.2014, 19:09    Titel: VB6: Set File Creation, Modified, Last Accessed Dates Antworten mit Zitat

Hallo,

hier gibt es ein Beispiel für VisualBASIC 6, das die gewünschte Funktionalität über das WinAPI bietet:
http://thescarms.com/vbasic/filetime.aspx

Der Quelltext modTime.bas sollte mit ein paar kleinen Änderungen auch in FreeBASIC compilierbar sein (u. a. #include "windows.bi" statt der expliziten Declares).

Viele Grüße!
Sebastian
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 07.05.2014, 05:19    Titel: Antworten mit Zitat

Hallo steini!

Bei mir (WinXP / FB 0.90.1) funktioniert dein o.g. Programmbeispiel sowohl für Sommer- als auch für Winterzeit einwandfrei. Hast du auf deinem Rechner die korrekte Zeitzone (GMT + 01:00) eingestellt?

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
steini



Anmeldungsdatum: 17.09.2004
Beiträge: 58

BeitragVerfasst am: 07.05.2014, 07:44    Titel: Antworten mit Zitat

Hallo grindstone,
muss dann wohl an XP liegen, wobei mir das komisch vorkommt. Bei mir Win7 /FB 0.90.1 steht immer 11 anstelle von 12 Uhr.

Das Problem ist hier eindeutig die LocalFileTimeToFileTime, die ein gegebenes lokales Datum in UTC wandelt, und zwar unter Berücksichtigung der im System eingestellten aktuellen Zeitzone. Es setzt die UTC für BEIDE Datums also auf 2 Stunden früher, da ja aktuell Sommerzeit ist (UTC+2). Die Funktion berücksichtigt dabei eben nicht, dass das eine Datum in der Winterzeit liegt, wo die Abweichung ja nur eine Stunde beträgt. Genau das müsste aber berücksichtigt werden.

Was ich also bräuchte wäre eine Funktion, die einem Datum, das in der Winterzeit liegt, 1 Stunde, einem in der Sommerzeit 2 Stunden abzieht. Die aktuelle System-Zeitzone darf dabei überhaupt keine Rolle spielen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
steini



Anmeldungsdatum: 17.09.2004
Beiträge: 58

BeitragVerfasst am: 07.05.2014, 08:17    Titel: Antworten mit Zitat

Die Lösung scheint die Funktion TzSpecificLocalTimeToSystemTime zu sein! Allerdings bekommen ich auf genau diese Funktion keinen Zugriff, es erscheint immer "Variable not declared". Weiß jemand Rat?

Hier mal Schwarz auf Weiß der entscheidende Unterschied:

TzSpecificLocalTimeToSystemTime takes into account whether daylight saving time (DST) is in effect for the local time to be converted.

LocalFileTimeToFileTime uses the current settings for the time zone and daylight saving time. Therefore, if it is daylight saving time, this function will take daylight saving time into account, even if the time you are converting is in standard time.

Damit ist auch klar, wie die Abweichung von einer Stunde bei Verwendung der Funktion LocalFileTimeToFileTime zustande kommt.

Code:
#INCLUDE ONCE "vbcompat.bi"
#INCLUDE ONCE "Windows.bi"

FUNCTION filehandel2( fname As String ) As HANDLE
  Dim OFS As OFSTRUCT
  OFS.cBytes = Len( OFS )
  Function = Cast( HANDLE, OpenFile( fname, @OFS, OF_READWRITE ))
End FUNCTION

Function Serial2FTime( datser As Double ) As FILETIME
  Dim As SYSTEMTIME sTime
  Dim As FILETIME fTime
  sTime.wYear   = Year  ( datser )
  sTime.wMonth  = Month ( datser )
  sTime.wDay    = Day   ( datser )
  sTime.wHour   = Hour  ( datser )
  sTime.wMinute = Minute( datser )
  sTime.wSecond = Second( datser )
'  TzSpecificLocalTimeToSystemTime( @sTime, @sTime)  '<-- Variable not declared!
  SystemTimeToFileTime( @sTime, @fTime )
  Function = fTime
End FUNCTION

DIM AS INTEGER f=FREEFILE
OPEN "test.txt" FOR OUTPUT AS #f: CLOSE #f
DIM AS HANDLE FileHdl3
DIM As FILETIME cTime, lwTime
DIM As Double datv
FileHdl3 = FILEHANDEL2("test.txt")
datv = DateValue("24.12.2013") + TimeValue("12:00:00") 'Liegt in Winterzeit
lwtime = Serial2FTime( datv )
datv = DateValue("24.05.2013") + TimeValue("12:00:00") 'Liegt in Sommerzeit
ctime = Serial2FTime( datv )
SetFileTime FileHdl3, @cTime, NULL, @lwTime
CloseHandle( FileHdl3)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
steini



Anmeldungsdatum: 17.09.2004
Beiträge: 58

BeitragVerfasst am: 07.05.2014, 10:36    Titel: Antworten mit Zitat

TzSpecificLocalTimeToSystemTime kommt für mich nun doch nicht in Frage. Täte zwar, was es soll, ist aber nur ab XP bzw. Server 2003 aufwärts lauffähig und damit für mich nicht brauchbar.

Nach langem Probieren und Suchen bin ich nun aber doch ENDLICH auf eine universell funktionierende Lösung gekommen. Folgend der Code. Danke für eure Anteilnahme und auf Bald!

Code:
#Include ONCE "vbcompat.bi"
#INCLUDE ONCE "Windows.bi"

FUNCTION filehandel2( fname As String ) As HANDLE
  Dim OFS As OFSTRUCT
  OFS.cBytes = Len( OFS )
  Function = Cast( HANDLE, OpenFile( fname, @OFS, OF_READWRITE ))
End FUNCTION

Function Serial2FTime( datser As Double ) As FILETIME
  Dim As SYSTEMTIME sTime, sTime2
  Dim As FILETIME fTime
  Dim As Time_Zone_Information tz
  sTime.wYear   = Year  ( datser )
  sTime.wMonth  = Month ( datser )
  sTime.wDay    = Day   ( datser )
  sTime.wHour   = Hour  ( datser )
  sTime.wMinute = Minute( datser )
  sTime.wSecond = Second( datser )
  GetTimeZoneInformation(@tz)
  tz.Bias = -tz.Bias
  tz.StandardBias = -tz.StandardBias
  tz.DaylightBias = -tz.DaylightBias
  SystemTimeToTzSpecificLocalTime(@tz, @sTime, @sTime2)
  SystemTimeToFileTime(@sTime2, @fTime)
  Function = fTime
End FUNCTION

DIM AS INTEGER f=FREEFILE
OPEN "test.txt" FOR OUTPUT AS #f: CLOSE #f
DIM AS HANDLE FileHdl3
DIM As FILETIME cTime, lwTime
DIM As Double datv
FileHdl3 = FILEHANDEL2("test.txt")
datv = DateValue("24.12.2013") + TimeValue("12:00:00") 'Liegt in Winterzeit
lwtime = Serial2FTime( datv )
datv = DateValue("24.05.2013") + TimeValue("12:00:00") 'Liegt in Sommerzeit
ctime = Serial2FTime( datv )
SetFileTime FileHdl3, @cTime, NULL, @lwTime
CloseHandle( FileHdl3)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz