![]() |
Dateidatum, Dateien vergleichen und Kopieren
Hallo,
ich versuche zwei Dateien zu vergleichen (Zeitstempel) und dann entweder von USB-Stick auf Festplatte oder von Festplatte auf USB zu kopieren. Ist die Datei nur auf einem Medium vorhanden funktioniert das Kopieren in beide Richtungen. Ist auf beiden Medien (Festplatte und USB) die Datei vorhanden funktioniert das Überschreiben nur von USB auf Festplatte. Beim Überschreiben von Festplatte auf USB gibt es einen Zeitversatz bei den Zeitstempeln von 2 Sekunden, d.h. nach dem Überschreiben ist die Datei auf dem USB-Stick neuer als auf der Festplatte. Ich könnte natürlich jetzt erst die Datei löschen und dann neu Schreiben, mich würde aber interessieren, ob es anstatt FileAge oder CopyFile bessere Befehle gibt, damit die Dateien nach einem Kopiervorgang wirklich gleich sind :?:. Hier der Codeteil, den ich dafür benutze:
Delphi-Quellcode:
FileAge(Datei1,Datum1,true);
FileAge(Datei1USB,Datum2,true); if Datum1>Datum2 then copyfile(PChar(Datei1),PChar(Datei1USB),false); if Datum1<Datum2 then copyfile(PChar(Datei1USB),PChar(Datei1),false); Danke und Gruß Hanns-Dieter |
AW: Dateidatum, Dateien vergleichen und Kopieren
Hallo,
setz doch nach dem Kopieren das Datum noch mal neu (SetFileAge). |
AW: Dateidatum, Dateien vergleichen und Kopieren
Hallo,
ich nutze zum Vergleich TFile.GetLastWriteTime, da ich früher mit ähnlichen Problemen zu tun hatte. Da es sich um TDateTime-Werte handelt, lasse ich aber dennoch eine gewisse Toleranz beim Vergleich zu. Die liegen allerdings im Millisekunden-Bereich. |
AW: Dateidatum, Dateien vergleichen und Kopieren
Danke schon mal für die schnelle Antwort. Wie machst Du das mit der Toleranz? Hast Du das ein Beispiel für mich?
|
AW: Dateidatum, Dateien vergleichen und Kopieren
TDateTime sind intern Float-Werte.
Da ich das in einer alten Anwendung nutze, ziehe ich einfach die beiden Werte voneinander ab und prüfe, ob der Absolut-Wert kleiner 0.0001 ist. Man kann aber auch die "neue" Funktion IsZero dafür nutzen. Entweder gab es die bei meiner damaligen Umstellung noch nicht oder ich wusste nicht, dass es die schon gab. Sonst hätte ich die dafür verwendet. |
AW: Dateidatum, Dateien vergleichen und Kopieren
Du kannst (z. B. mit dem
![]() |
AW: Dateidatum, Dateien vergleichen und Kopieren
.. bleibt dann nur die Frage welche Datei dann aktueller ist.
Nur am Hash wird man dies nicht erkennen können. Grüße Klaus |
AW: Dateidatum, Dateien vergleichen und Kopieren
Ich nutze die Version von
![]()
Delphi-Quellcode:
Aufgerufen wird diese dann:
function GetFileVersion(Path: string): string;
var lpVerInfo: pointer; rVerValue: PVSFixedFileInfo; dwInfoSize: cardinal; dwValueSize: cardinal; dwDummy: cardinal; lpstrPath: pchar; begin if Trim(Path) = EmptyStr then lpstrPath := pchar(ParamStr(0)) else lpstrPath := pchar(Path); dwInfoSize := GetFileVersionInfoSize(lpstrPath, dwDummy); if dwInfoSize = 0 then begin Result := 'No version specification'; Exit; end; GetMem(lpVerInfo, dwInfoSize); GetFileVersionInfo(lpstrPath, 0, dwInfoSize, lpVerInfo); VerQueryValue(lpVerInfo, '', pointer(rVerValue), dwValueSize); with rVerValue^ do begin Result := IntTostr(dwFileVersionMS shr 16); Result := Result + '.' + IntTostr(dwFileVersionMS and $FFFF); Result := Result + '.' + IntTostr(dwFileVersionLS shr 16); Result := Result + '.' + IntTostr(dwFileVersionLS and $FFFF); end; FreeMem(lpVerInfo, dwInfoSize); end; {function GetFileVersion() ...}
Delphi-Quellcode:
Und was die Auswertung angeht, kommt es auf den Aufbau der Versionsnummer an. Gehe ich von dem gleichen Aufbau wie in Delphi aus, wäre eine Möglichkeit die Dateiversion in teilen zu prüfen. Dabei würde ich wie folgt vorgehen:
variable1 := GetFileVersion('USB.exe');
variable2 := GetFileVersion('HDD.exe'); 1. Die Dateiversionen nach '.' durchsuchen und zählen (= Anzahl der zu prüfenden Zahlen + 1; evtl. Vergleichen ob beide Versionsnummern die gleiche Anzahl haben!) z.B.(Herkunft weiß ich nicht mehr^^):
Delphi-Quellcode:
Aufruf:
function Split(text: string; delimiter: char; p: integer): string;
var stl: TStrings; begin stl := TStringList.Create; try stl.delimiter := delimiter; stl.DelimitedText := text; finally result := stl.Strings[p]; stl.free; end; end;
Delphi-Quellcode:
split(String, '.', Teil);
2. Die entsprechenden Teile mit einander vergleichen, von vorne nach hinten. 3. Sobald sie unterschiedlich sind, prüfen welche größer ist und die Vergleichs-Schleife verlassen. 4. Kopiervorgang abhängig der letzten Prüfung einleiten. |
AW: Dateidatum, Dateien vergleichen und Kopieren
Zitat:
Wenn aber der Stick für den Datenaustasch "onthefly" genutzt wird,hilft nur die Beurteilung durch den Nutzer.Aber alle gleichen Dateien fallen dann schon einmal weg. Gruß K-H |
AW: Dateidatum, Dateien vergleichen und Kopieren
@Moombas
Ja, aber nur wenn es sich um Dateien handelt, die auch diese Versionsinformationen in sich tragen, was ich hier bezweifeln möchte |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:15 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