Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Datei-Änderungsuhrzeit in einer Schleife ändern, 1 Stunde zuviel... (https://www.delphipraxis.net/173326-datei-aenderungsuhrzeit-einer-schleife-aendern-1-stunde-zuviel.html)

juergen 17. Feb 2013 19:19

Datei-Änderungsuhrzeit in einer Schleife ändern, 1 Stunde zuviel...
 
Hallo zusammen,

ich suche schon eine ganze Weile, finde aber das eigentlich Problem nicht und weiß wohl deswegen auch nicht so recht wonach ich suchen muss.
In einer Schleife ändere ich die Uhrzeit. Dabei wird die Beginn-Uhrzeit als Offset gesetzt und dann die Anzahl der Sekunden, um welche sich die UHrzeit bei jeder neuen Datei erhöhen soll.
Im Debugger werden mir die richtigen Werte der Funktionen angezeigt! Im Betriebssystem wird die letzte Datei aus der Schleife mit der richtigen Uhrzeit angezeigt, alle anderen Dateien sind um genau 1 Stunde zu hoch....

Hier mein relevanter Code:

Delphi-Quellcode:
function GetFileDate(TheFileName: string): TDateTime;
var
  FHandle: integer;
begin
  FHandle := FileOpen(TheFileName, 0);
  try
    Result := (FileDateToDateTime(FileGetDate(FHandle)));
  finally
    FileClose(FHandle);
  end;
end;

procedure TMain_Form.Set_myNewFileTime(FileName: string);
var
  OldFDate, FileDate: TDateTime;
  OldFTime, NewFTime, Start_Time: Double;
begin
  if (Chckb_Uhrzeit_hochzaehlen.Checked) and ((Time_pick_Datei_Offsettime.Text <> '00:00:00') or (SpEdt_Sekundenzaehler.Value <> 0)) then begin
    OldFDate := GetFileDate(FileName);
    Start_Time := (Time_pick_Datei_Offsettime.Value);
    NewFTime := Start_Time + (SpinEdit_Sekundenzaehler.Value / 86400);
    FileDate := Trunc(OldFDate) + NewFTime;
    ChangeFileTimeStamp(FileName, FileDate);
  end;
end;

procedure....
var
  li_Sekundenzaehler : Integer;
beginn
  li_Sekundenzaehler := SpEdt_Sekundenzaehler.Value;
  //Beginn Schleife...
  Set_myNewFileTime(FileName); //
  SpEdt_Sekundenzaehler.Value := SpEdt_Sekundenzaehler.Value + li_Sekundenzaehler;
...
  //Ende Schleife
  SpEdt_Sekundenzaehler.Value := li_Sekundenzaehler;
end;
Mit den ganzen Datumsfunktionen stehe ich eh etwas auf Kriegsfuß, allzumal wenn man wenig damit arbeitet.

Kann mir hier jemand den richtigen Schubser geben?
Vielen Dank!

Dalai 17. Feb 2013 19:24

AW: Datei-Änderungsuhrzeit in einer Schleife ändern, 1 Stunde zuviel...
 
Auch wenn ich nicht wirklich Ahnung habe: Kann es sein, dass die Zeitstempel im Programm bzw. den Funktionen in UTC sind? Das würde genau zu der Stunde Differenz passen.

MfG Dalai

juergen 17. Feb 2013 19:47

AW: Datei-Änderungsuhrzeit in einer Schleife ändern, 1 Stunde zuviel...
 
@Dalai,
das denke ich auch dass es irgendwo an der UTC-Zeit liegt. Doch warum hat die letzte Datei aus der Schleife dann den richtigen Uhrzeitwert? Wahrscheinlich hängt es beim
FileGetDate. In der Hilfe steht dass die Betriebssytemuhrzeit ausgelesen wird. Ob das die UTC-Zeit ist?
Momentan weiß ich nicht wie ich das Problem lösen könnte.:oops:

Dalai 17. Feb 2013 21:07

AW: Datei-Änderungsuhrzeit in einer Schleife ändern, 1 Stunde zuviel...
 
Zitat:

Zitat von juergen (Beitrag 1204048)
In der Hilfe steht dass die Betriebssytemuhrzeit ausgelesen wird. Ob das die UTC-Zeit ist?

Nein. UTC ist "die Weltzeit" (und mehr oder minder mit GMT identisch). Die Betriebssysteme nutzen aber in aller Regel lokale Zeit, wobei Linux und Windows unterschiedliche Annahmen darüber machen, mit welcher Zeit die Hardwareuhr läuft (Linux nimmt in aller Regel UTC an, Windows aber lokale Zeit). Ich dachte es mir ja fast, dass die API-Funktionen mit lokaler Zeit arbeiten, aber es hätte ja sein können, dass es irgendwas damit zu tun hat.

MfG Dalai

Angel4585 18. Feb 2013 09:37

AW: Datei-Änderungsuhrzeit in einer Schleife ändern, 1 Stunde zuviel...
 
Wieviele Dateien sind das?
Bringt eine andere Anzahl Dateien ein anderes Ergebnis?

Liegt es evtl. an der Datei selbst? Was passiert, wenn eine andere als letztens dran ist?

Time_pick_Datei_Offsettime ist ein TDateTimePicker?
Hast du mal Time_pick_Datei_Offsettime.Time oder Trunc(Time_pick_Datei_Offsettime.Value) anstatt Time_pick_Datei_Offsettime.Value getestet?

juergen 18. Feb 2013 18:38

AW: Datei-Änderungsuhrzeit in einer Schleife ändern, 1 Stunde zuviel...
 
Hallo Angel4585,

danke für deine Unterstützung!:thumb:
Bei Verwendung mit Trunc(Time_pick_Datei_Offsettime.Value) oder Trunc(Time_pick_Datei_Offsettime.Time) kommen ganz falsche Uhrzeiten raus, allerdings wieder mit dem selben Verhalten: Bis auf die letzte Datei haben alle anderen Dateien eine Stunde zuviel.
Das Verhalten habe ich bei anderen Dateien auch bzw. auch bei unterschiedlicher Anzahl von Dateien, die letzte Datei aus der Schleife hat die richtige Uhrzeit, alle anderen haben eine Stunde zuviel...

hmm, Ratlose Grüße

Dalai 18. Feb 2013 19:48

AW: Datei-Änderungsuhrzeit in einer Schleife ändern, 1 Stunde zuviel...
 
Nach einem intensiveren Blick auf deinen Code fiel mir dies noch auf:
Delphi-Quellcode:
[...] SpEdt_Sekundenzaehler.Value [...]
NewFTime := Start_Time + (SpinEdit_Sekundenzaehler.Value / 86400);
Gibt es zwei davon oder ist das nur ein Versehen/Vertipper?

MfG Dalai

juergen 18. Feb 2013 19:55

AW: Datei-Änderungsuhrzeit in einer Schleife ändern, 1 Stunde zuviel...
 
Hallo Dalai ,
:oops: ist ein versehen, nur hier...

Angel4585 18. Feb 2013 19:58

AW: Datei-Änderungsuhrzeit in einer Schleife ändern, 1 Stunde zuviel...
 
Ja natürlich nicht Trunc(), bin ich doof xD Trunc() gibt den ganzzahligen Anteil zurück.
Na wie war das mit dem NACHkomma-anteil? Komm grad nicht drauf, bin schon müde...

mich würde die gesamte procedure mit BeginSchleife und EndSchleife interessieren, liegt da vielleicht das Problem?

juergen 18. Feb 2013 20:12

AW: Datei-Änderungsuhrzeit in einer Schleife ändern, 1 Stunde zuviel...
 
du meintest wahrscheinlich Frac(). Leider hilft das auch nicht weiter, weder mit SpEdt_Sekundenzaehler.Time noch mit SpEdt_Sekundenzaehler.Value noch mit Frac(NewFTime)

musicman56 19. Feb 2013 08:32

AW: Datei-Änderungsuhrzeit in einer Schleife ändern, 1 Stunde zuviel...
 
Hallo,

was macht eigentlich "ChangeFileTimeStamp(FileName, FileDate)" ?

Probier's mal damit:

Delphi-Quellcode:
function RF_SetAllFileDates(FName: string;
                            aCreation,
                            aLastAccess,
                            aLastWrite : TDateTime): boolean;
var
  aHandle: integer;
  FT1, FT2, FT3: TFileTime;
  locFT1, locFT2, locFT3: TFileTime;
  ST1, ST2, ST3 : TSystemTime;
begin
  aHandle := FileOpen(FName, fmOpenWrite or fmShareDenyWrite);
  Result := aHandle >= 0;

  if Result then
  try
    DateTimeToSystemTime(aCreation,ST1);
    DateTimeToSystemTime(aLastAccess,ST2);
    DateTimeToSystemTime(aLastWrite,ST3);

    SystemTimeToFileTime(ST1,FT1);
    SystemTimeToFileTime(ST2,FT2);
    SystemTimeToFileTime(ST3,FT3);

    LocalFileTimeToFileTime(FT1,locFT1);
    LocalFileTimeToFileTime(FT2,locFT2);
    LocalFileTimeToFileTime(FT3,locFT3);

    SetFileTime(aHandle,@locFT1, @locFT2, @locFT3);
  finally
    FileClose(aHandle);
  end;
end;

juergen 20. Feb 2013 20:22

AW: Datei-Änderungsuhrzeit in einer Schleife ändern, 1 Stunde zuviel...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo musicman56,
danke für deine Hilfestellung!:)
Ich habe das bei mir so umgestellt, aber in meinem eigentlichem Projekt verhält es sich immer noch so, dass die letzte Datei aus der Schleife die richtige Uhrzeit hat, alle anderen haben eine Stunde zuviel...
Weiterhin werden die Uhrzeiten mal gesetzt und dann wieder nicht. Irgendwas stimmt da noch nicht.

Ich habe jetzt ein Testprojekt zusammengeklöppelt. Hier werden die Uhrzeit erst gar nicht gesetzt... Momentan sehe ich das Problem gar nicht.

2 Fragen zum Test-Projekt:
1. Warum werden die Uhrzeiten der Testdateien im Unterordner "Testdateien_zum_umbenennen" nicht gesetzt und
2. wenn die Uhrzeiten gesetzt werden können, sind diese Uhrzeiten dann auch korrekt?

Vielen Dank vorab für Hilfestellung.
Das Test-Projekt ist hier im Anhang.

musicman56 20. Feb 2013 21:59

AW: Datei-Änderungsuhrzeit in einer Schleife ändern, 1 Stunde zuviel...
 
Hallo Jürgen,

probier's mal so:

Delphi-Quellcode:
procedure TFrm_Main.Set_my_global_Time_Variablen(FileName: string);
var
  OldFileDateTime, NewFileDateTime: TDateTime;
  TimeOffset: Double;
begin
  OldFileDateTime := GetFileDate(FileName);
  TimeOffset := Frac(TP_Datei_Offsettime.Time) + (SpEdt_Sekundenzaehler.Value / 86400);
  NewFileDateTime := OldFileDateTime + TimeOffset;
  . . . .
Eines der Probleme mit deinem Code könnte sein: Wenn die Uhrzeit z.B. 23:59 ist, und eine Stunde dazu kommt, dann muss auch der Tag erhöht werden. In diesem Fall wird das TimeOffset > 1 und somit funktionierts (ungetestet)

juergen 20. Feb 2013 22:27

AW: Datei-Änderungsuhrzeit in einer Schleife ändern, 1 Stunde zuviel...
 
Hallo musicman,
danke für deine Antwort.
Leider hilft das auch nicht. Die Uhrzeiten werden einfach nicht gesetzt!
Ich lass mir in dieser Procedure eine Message anzeigen, da ist alles richtig. Mit deinem Code wird die vorhandene Zeit hochgezählt um den Wert aus dem Timepicker.
Dass die Uhrzeiten gar nicht gesetzt werden liegt vermutlich an der Funktion Set_my_New_Time. Allerdings erkenne ich nicht warum es die Funktion nicht tut.:(

EDIT!!!
Ich hatte angenommen, dass LastAccessTime das Änderungsdatum sei!!! Davon war ich so überzeugt, dass ich gar nicht in Betracht zog da näheres zu lesen. Das Änderungsdatum ist aber LastWriteTime!
Habe erst jetzt die Hilfe von SetFileTime mal *richtig* gelesen...
Sorry, da war ich zu oberflächlich. Thema hat sich somit erledigt. Nun wird auch alles richtig erstellt.
Gute Nacht!

juergen 20. Feb 2013 22:55

AW: Datei-Änderungsuhrzeit in einer Schleife ändern, 1 Stunde zuviel...
 
Hiermit setze ich das Thema auf beantwortet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz