AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dateidatum, Dateien vergleichen und Kopieren

Ein Thema von Grisu2000 · begonnen am 12. Feb 2019 · letzter Beitrag vom 14. Feb 2019
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#11

AW: Dateidatum, Dateien vergleichen und Kopieren

  Alt 13. Feb 2019, 09:45
Ok, wenn es wirklich nur über den Zeitstempel geht:

Ich nutze bei mir (Updater) die Copyfile funktion zum kopieren von Dateien. Habe da nie drauf geachtet und daher eben mal getestet. Er kopiert bei mir die Datei 1:1 incl. Änderungsdatum. (Datei wurde 10:41 das letzte mal geändert - um 10:42 kopiert - neue Datei Hat als Änderungsdatum 10:41, kopiert wurde von lokaler HDD auf Server HDD)

Da kommt mir die Frage auf welche Zeitstempel verglichen werden, wenn du das Änderungsdatum (nicht das Erstelldatum!) vergleichst, müsste deine Prüfung nach Zeit normalerweise passen.

Folgende Funktion würde dir das Änderungsdatum ausgeben;
Delphi-Quellcode:
function ReportFileTimes(const FileName: string) : TDateTime;

  procedure ReportTime(const Name: string; const FileTime: TFileTime);
  var
    SystemTime, LocalTime: TSystemTime;
  begin
    if not FileTimeToSystemTime(FileTime, SystemTime) then
      RaiseLastOSError;
    if not SystemTimeToTzSpecificLocalTime(nil, SystemTime, LocalTime) then
      RaiseLastOSError;
    result:=SystemTimeToDateTime(LocalTime);
  end;

var
  fad: TWin32FileAttributeData;
begin
  if not GetFileAttributesEx(PChar(FileName), GetFileExInfoStandard, @fad) then
    RaiseLastOSError;
  ReportTime('Modified', fad.ftLastWriteTime);
end;
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas (13. Feb 2019 um 10:11 Uhr)
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#12

AW: Dateidatum, Dateien vergleichen und Kopieren

  Alt 13. Feb 2019, 10:18
Das Verhalten liegt an NTFS (Festplatte) vs. FAT32 (USB-Stick).

Hier ein kleiner Test, wo man immer eine Differenz von 1-2 Sekunden sieht, obwohl die Werte exakt gleich sein müssten (siehe den unteren Teil, wo der Wert explizit bei beiden gleich gesetzt wird).
Delphi-Quellcode:
program FileAgeTest;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  System.IOUtils;

procedure Main;
const
  NTFSVolume = 'E:\'; // muss ein NTFS-Laufwerk sein
  FAT32Volume = 'F:\'; // muss ein FAT32-Laufwerk sein
  FileName = 'TestFile.txt';
var
  LastWrite: TDateTime;
begin
  if TFile.Exists(TPath.Combine(NTFSVolume, FileName)) then
    TFile.Delete(TPath.Combine(NTFSVolume, FileName));
  if TFile.Exists(TPath.Combine(FAT32Volume, FileName)) then
    TFile.Delete(TPath.Combine(FAT32Volume, FileName));

  TFile.WriteAllText(TPath.Combine(NTFSVolume, FileName), 'test');
  Writeln(DateTimeToStr(TFile.GetLastWriteTime(TPath.Combine(NTFSVolume, FileName))));
  TFile.Copy(TPath.Combine(NTFSVolume, FileName),TPath.Combine(FAT32Volume, FileName));
  Writeln(DateTimeToStr(TFile.GetLastWriteTime(TPath.Combine(FAT32Volume, FileName))));

  LastWrite := System.SysUtils.Now;

  TFile.SetLastWriteTime(TPath.Combine(NTFSVolume, FileName),LastWrite);
  TFile.SetLastWriteTime(TPath.Combine(FAT32Volume, FileName),LastWrite);

  Writeln(DateTimeToStr(TFile.GetLastWriteTime(TPath.Combine(NTFSVolume, FileName))));
  Writeln(DateTimeToStr(TFile.GetLastWriteTime(TPath.Combine(FAT32Volume, FileName))));
end;

begin
  try
    Main;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.468 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#13

AW: Dateidatum, Dateien vergleichen und Kopieren

  Alt 13. Feb 2019, 11:08
FAT kann die Zeit nur mit einer Auflösung von 2 Sekunden speichern (Bit 0 wird weggelassen), NTFS ist da genauer.
Thomas Mueller
  Mit Zitat antworten Zitat
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Dateidatum, Dateien vergleichen und Kopieren

  Alt 13. Feb 2019, 11:27
.. bleibt dann nur die Frage welche Datei dann aktueller ist.
Nur am Hash wird man dies nicht erkennen können.
Du kannst mit der Windows API feststellen wenn sich eine Datei ändert: SHChangeNotifyEntry, SHChangeNotifyRegister.

Es gibt auch Delphi Implementationen z. B. TJvChangeNotify aus der JVCL (Download). Aus die schnelle habe ich noch die Unit DirWatch von Angus Johnson gefunden.

Natürlich kannst du das auch selbst schreiben. z. B. einen Thread erstellen der (ggf. in bestimmten Intervallen) den Hash einer oder mehrerer Dateien erstellt. Hat sich der Hash seit dem letzten Durchlauf geändert weißt du das die Datei geändert wurde. Dann musst du nur noch via Synchronize (wichtig!) ein Event aufrufen und schon kann dein Programm darauf reagieren und die Datei kopieren. Aber Achtung: Wenn der Thread während dem kopieren weiter läuft, wird er natürlich die kopierte Datei ebenfalls als geändert betrachten. Evtl. den Thread einfach mitteilen das die Datei zwar geändert wurde, der Thread aber diese "Änderung" bis zur "richtigen Änderung" ignorieren soll. Aber es gibt bestimmt auch noch andere Wege. Gut am Thread ist das dein Programm nicht einfriert und weiter benutzt werden kann.
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#15

AW: Dateidatum, Dateien vergleichen und Kopieren

  Alt 13. Feb 2019, 11:34
Du kannst mit der Windows API feststellen wenn sich eine Datei ändert: SHChangeNotifyEntry, SHChangeNotifyRegister.
Bei so einem USB-Stick denke ich auch immer daran, dass der mobil ist, also auch nicht am Rechner angeschlossen ist, oder sogar an einem anderen Rechner und dort andere Dateien aufgespielt bekommt.
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#16

AW: Dateidatum, Dateien vergleichen und Kopieren

  Alt 13. Feb 2019, 11:51
Betrifft es auch das Änderungsdatum wegen dem Zeitunterschied (NTFS <> Fat32), insbesondere wenn die Datei ggf. das Datum schon beinhaltet hat?
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas (13. Feb 2019 um 12:09 Uhr)
  Mit Zitat antworten Zitat
Grisu2000

Registriert seit: 2. Jan 2014
6 Beiträge
 
#17

AW: Dateidatum, Dateien vergleichen und Kopieren

  Alt 13. Feb 2019, 17:20
Es gibt keine Versionsnummer in der Datei.
Mit der Version von Jasocul mit GetLastWriteTime funktioniert es wie ich es brauche.
Aber mit den anderen Beispielen hab ich auch schon wieder viel gelernt.

Danke an Alle!!!
  Mit Zitat antworten Zitat
Grisu2000

Registriert seit: 2. Jan 2014
6 Beiträge
 
#18

AW: Dateidatum, Dateien vergleichen und Kopieren

  Alt 14. Feb 2019, 19:08
Es gibt keine Versionsnummer in der Datei.
Mit der Version von Jasocul mit GetLastWriteTime funktioniert es wie ich es brauche.
Aber mit den anderen Beispielen hab ich auch schon wieder viel gelernt.

Danke an Alle!!!

Geändert von Grisu2000 (14. Feb 2019 um 19:11 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz