AW: Dateidatum, Dateien vergleichen und Kopieren
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; |
AW: Dateidatum, Dateien vergleichen und Kopieren
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. |
AW: Dateidatum, Dateien vergleichen und Kopieren
FAT kann die Zeit nur mit einer Auflösung von 2 Sekunden speichern (Bit 0 wird weggelassen), NTFS ist da genauer.
|
AW: Dateidatum, Dateien vergleichen und Kopieren
Zitat:
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. |
AW: Dateidatum, Dateien vergleichen und Kopieren
Zitat:
|
AW: Dateidatum, Dateien vergleichen und Kopieren
Betrifft es auch das Änderungsdatum wegen dem Zeitunterschied (NTFS <> Fat32), insbesondere wenn die Datei ggf. das Datum schon beinhaltet hat?
|
AW: Dateidatum, Dateien vergleichen und Kopieren
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!!! |
AW: Dateidatum, Dateien vergleichen und Kopieren
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!!! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:21 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