[gelöst] Zeitstempel von Backup-Dateien falsch

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

[gelöst] Zeitstempel von Backup-Dateien falsch

Beitrag von catweasel »

Hallo

Ich habe hier ein Problem bei dem ich einfach nicht weiterkomme.
Es geht darum das mein Programm einen Editor hat der, wenn der Inhalt als Datei gespeichert wird, bis zu 9 Backup Dateien rolierend erstellt.

Bisher waren die original Datei und die Backups immer im gleichen Verzeichnis was kein Problem war.
Jetzt möchte ich das die original Datei in einem Verzeichnis, und die Backup Dateien in einem anderen Verzeichnis erstellt werden.
Allerdings stellt sich heraus das die ganzen Zeitstempel wann die Dateien erstellt/geändert wurden beim Backup nicht stimmen.

Ich habe hier mal ein einfachen Testcode erstellt. Gebraucht wird nur eine "SynEdit"-Komponenten und zwei einfache Buttons.



Hier der Code für den Button der das Backup in das gleiche Verzeichnis schreibt wo die original Datei liegt.
Die Zeitstempel wann die Dateien inhaltlich verändert wurden wird nicht verändert - richtig

Code: Alles auswählen

// Original und Backup liegen im gleichen Verzeichnis
procedure TForm1.SameDirButtonClick(Sender: TObject);
var rolieren  : byte = 0;
    datei     : String;
begin
  datei    := 'test.txt';
 
  // *.txt.bak9 löschen da nicht mehr gebraucht
  if fileexists(datei+'.bak9') then DeleteFile(datei+'.bak9');
 
  // *.txt.bak1-8 umbenennen in *.txt.bak2-9 (je um 1 erhöhen)
  for rolieren := 8 downto 1 do
 
     if fileexists(datei+'.bak'+inttostr(rolieren)) then begin
         RenameFile (datei+'.bak'+inttostr(rolieren),
                     datei+'.bak'+inttostr(rolieren+1));
      end;
 
  // Die letzte test.txt Version in test.txt.bak1 umbenennen
  RenameFile (datei, datei+'.bak1');
 
  // jetzt den Editor speichern als test.txt
  SynEdit1.Lines.SaveToFile(datei);
end;
 



Das ist der Code für den Button der die Backups in ein anderes Verzeichniss schreibt.
Die Zeitstempel wann die Dateien inhaltlich verändert wurden stimmen nicht. Es wird scheinbar immer der Zeitstempel
genommen wann die erste Backupdatei erstellt wurde - falsch

Code: Alles auswählen

// Original und Backup liegen in unterschiedlichen Verzeichnissen
procedure TForm1.DifferentDirButtonClick(Sender: TObject);
var rolieren : byte = 0;
    datei,
    backup   : String;
begin
  datei  := 'test.txt';
 
  //LW und Pfad der Datei tauschen
  backup := 'c:\temp\'+ExtractFileName(datei);
 
  // *.txt.bak9 löschen da nicht mehr gebraucht
   if fileexists(backup+'
.bak9') then DeleteFile(backup+'.bak9');
 
   // *.txt.bak1-8 umbenennen in *.txt.bak2-9 (je um 1 erhöhen)
   for rolieren := 8 downto 1 do
 
      if fileexists(backup+'
.bak'+inttostr(rolieren)) then begin
          RenameFile (backup+'
.bak'+inttostr(rolieren),
                      backup+'
.bak'+inttostr(rolieren+1));
       end;
 
   // Die letzte test.txt Version in test.txt.bak1 umbenennen
   RenameFile (datei, backup+'
.bak1');
 
   // jetzt den Editor speichern als test.txt
   SynEdit1.Lines.SaveToFile(datei);
end;


Ich kann mir das ganze nicht erklären.
Was muß ich machen damit der Zeitstempel der original Datei bei den Backups erhalten bleibt wenn die Backups in einem anderen Verzeichnis erstellt werden?

Gruß
Michael
Zuletzt geändert von catweasel am Mo 16. Jan 2017, 12:36, insgesamt 1-mal geändert.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Zeitstempel von Backup-Dateien falsch

Beitrag von Michl »

Vermutlich wolltest du statt

Code: Alles auswählen

   SynEdit1.Lines.SaveToFile(datei);
diese Zeile

Code: Alles auswählen

   SynEdit1.Lines.SaveToFile(backup);

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: Zeitstempel von Backup-Dateien falsch

Beitrag von catweasel »

Michl hat geschrieben:Vermutlich wolltest du statt

Code: Alles auswählen

   SynEdit1.Lines.SaveToFile(datei);
diese Zeile

Code: Alles auswählen

   SynEdit1.Lines.SaveToFile(backup);


Das Problem ist das die Originaldatei in einem anderen Verzeichnis liegen soll, als alle Backup-Dateien.

1.
Ersteinmal werden alle Dateien die bereits im Backup-Verzeichnis B vorhanden sind roliert, d.h.
die bereits bestehenden Backups test.txt.bak(n) werden jeweils um eine Ziffer hochgesetzt,
also aus .bak8 wird .bak9, aus .bak7 wird .bak8 usw.
2.
Dann wird die bisherige "test.txt" im Verzeichnis A zu "test.txt.bak1" umbenannt und ins Verzeichnis B verschoben.
3.
Erst zum schluß wird die aktuelle "test.txt" ins Verzeichnis A geschrieben.




Die Datei wird umbenannt und verschoben. Und dabei wird leider der Zeitstempel der Originaldatei überschrieben.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Zeitstempel von Backup-Dateien falsch

Beitrag von Michl »

Jetzt habe ich es verstanden.

Unter Windows wird letztlich "function MoveFileW(lpExistingFileName:LPCWSTR; lpNewFileName:LPCWSTR):WINBOOL; external 'kernel32' name 'MoveFileW';" aufgerufen. Vermutlich kann Windows ein File nicht in ein anderes Verzeichnis umbenennen, sondern es wird verschoben (kopiert und gelöscht).

So sollte es aber funktionieren:

Code: Alles auswählen

   CopyFile (datei, backup+'.bak1', [cffOverwriteFile, cffCreateDestDirectory, cffPreserveTime]);
//   RenameFile (datei, backup+'.bak1');

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: Zeitstempel von Backup-Dateien falsch

Beitrag von catweasel »

Michl hat geschrieben:[...] Vermutlich kann Windows ein File nicht in ein anderes Verzeichnis umbenennen, sondern es wird verschoben (kopiert und gelöscht).

So sollte es aber funktionieren:

Code: Alles auswählen

   CopyFile (datei, backup+'.bak1', [cffOverwriteFile, cffCreateDestDirectory, cffPreserveTime]);
//   RenameFile (datei, backup+'.bak1');


Das würde erklären warum alle Backups das gleiche Datum haben (vom Moment des ersten rolierens) obwohl das original ein anderes Datum hat.
Ich werde Dein Hinweis testen sobald ich kann und melde mich wieder.
Danke bis dahin für die Info.

Gruß
Michael

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: Zeitstempel von Backup-Dateien falsch

Beitrag von catweasel »

Michl hat geschrieben:So sollte es aber funktionieren:

Code: Alles auswählen

   CopyFile (datei, backup+'.bak1', [cffOverwriteFile, cffCreateDestDirectory, cffPreserveTime]);
//   RenameFile (datei, backup+'.bak1');

Super, ich kann jetzt bestätigen das das die Lösung für mein Problem ist.
Danke für die Hilfe :D

Gruß
Michael

Antworten