![]() |
Exaktes Filecopy für Windows und Android
Ich möchte eine "Exakte" Kopie einer Datei, mit
Delphi-Quellcode:
TFile.Copy(filename1, filename2, true);
ist aber das Änderungsdatum der kopierten Datei genau der Zeitpunkt des Kopierens! Bei einem Cloudsystem wird diese Datei nun als geändert betrachtet, obwohl sie aus einer unveränderten Originaldatei entstanden ist! Wie erzeuge ich eine "exakte" Kopie einer Datei, wo der Erstellungszeitpunkt sowie der Zeitpunkt der letzten Änderung mit dem Original übereinstimmt? Ciao Stefan |
AW: Exaktes Filecopy
Ich würde dafür die Zeitangaben der Quelldatei in ein Record oder so speichern, die Datei kopieren und dann die vorher zwischengespeicherten Zeitangaben auf die Zieldatei übertragen.
|
AW: Exaktes Filecopy
Falls es Probleme gibt, das sollte es bewirken.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function GetCreationDate(fn:string):TDateTime; var FHandle : THandle; A,C,W : TFileTime; SysTimeStruct: SYSTEMTIME; begin Fhandle:=createfile(PChar(Fn), 0,FILE_SHARE_READ, nil, OPEN_EXISTING, SECURITY_ANONYMOUS, 0); if GetTimeZoneInformation(TimeZoneInfo) <> $FFFFFFFF then if GetFileTime(FHandle,@C, @A, @W) then begin FileTimeToSystemTime(C, SysTimeStruct); Result := SystemTimeToDateTime(SysTimeStruct); end; FileClose(FHandle); end; function SetCreationDate(FileName: string; dtCreation: TDateTime): Boolean; var hHandle: THandle; ftCreation: TFiletime; function DTtoFT(dt: TDateTime): TFiletime; var dwft: DWORD; ft: TFiletime; begin dwft := DateTimeToFileDate(dt); DosDateTimeToFileTime(LongRec(dwft).Hi, LongRec(dwft).Lo, ft); LocalFileTimeToFileTime(ft, Result); end; begin hhandle := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE,0,nil, OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS, 0); if hHandle <> INVALID_HANDLE_VALUE then begin try ftCreation := DTtoFT(dtCreation); Result := SetFileTime(hHandle, @ftCreation, nil, nil); finally CloseHandle(hHandle); end; end else Result := False; end; procedure TForm1.Button1Click(Sender: TObject); var getdate: tdatetime; sor,des: string; begin sor :='c:\bdlog.txt'; des := 'd:\bdlog.txt'; getdate := GetCreationDate(sor); CopyFile(PChar(sor),PChar(des),false); SetCreationDate(des, getdate); ShowMessage(DateTimeToStr(getdate)); end; end. |
AW: Exaktes Filecopy
"Exakt" ist so schwer zu definieren... jede Datei hat ja nunmal drei Zeitstempel (created, modified, last accessed), nicht nur einen. Und dann noch die Standard-Attribute (system, hidden, read-only). Und eventuell noch alternative Datenströme. Und natürlich Berechtigungen.
Betrachtet man "exakt" als absolut, muss man dann noch überlegen, was davon eigentlich zur "Datei" gehört und was Metadaten sind. Ist schon der Zeitstempel so eines? Ist die Anforderung eine "exakte Kopie einer Datei samt aller Metadaten"? Oder eine "exaktere Kopie einer Datei samt aller Metadaten"? Oder eine "Datei samt den Ansprüchen, die genau definiert sein müssen, genügenden Metadaten". Und für letzteres müsste man dokumentieren, welche dieser Metadaten das "Cloudsystem" genau betrachtet, bzw. wenn es allgemeiner und nicht auf ein System zugeschnitten sein soll, welcher Umfang wohl für alle Ansprüche reicht. |
AW: Exaktes Filecopy
Das hier sollte alles per IOUtils.pas abdecken.
Delphi-Quellcode:
TFile.Copy( Source, Dest );
TFile.SetAttributes( Dest, TFile.GetAttributes( Source ) ); TFile.SetCreationTime( Dest, TFile.GetCreationTime( Source ) ); TFile.SetCreationTimeUtc( Dest, TFile.GetCreationTimeUtc( Source ) ); TFile.SetLastAccessTime( Dest, TFile.GetLastAccessTime( Source ) ); TFile.SetLastAccessTimeUtc( Dest, TFile.GetLastAccessTimeUtc( Source ) ); TFile.SetLastWriteTime( Dest, TFile.GetLastWriteTime( Source ) ); TFile.SetLastWriteTimeUtc( Dest, TFile.GetLastWriteTimeUtc( Source ) ); |
AW: Exaktes Filecopy
Kleiner Hinweis. Bei TFile.WasWeißIch sollte man vorher immer auf Exist prüfen.
|
AW: Exaktes Filecopy
Ja das stimmt, auch andere Methoden-Ergebnisse sollte man auswerten bevor man weitermacht.
Das sind nur Basics die einem halt die Basics zeigen sollen, kein fertiges Programm, Holzhammermethode :-] Ps: So fleißig wie HolgerX in letzter Zeit ist fertige Programm-Beispiele zu geben, mal abwarten ob hier auch eins kommt :) |
AW: Exaktes Filecopy für Windows und Android
Danke für den Code!
Funktioniert bestens unter Windows, was ich aber vergessen hatte, ich brauche es für Windows und Android! (habe den Betreff jetzt erweitert) Und nach rausnehmen der Uses Windows.... ... fehlt einiges! Ich habe vergeblich versucht, das für Android nachzubilden! Ciao Stefan |
AW: Exaktes Filecopy für Windows und Android
Android ist Linux. Da würde ich mir erst gar keine Mühe für machen. Das ganze Rechtesystem bei Android/Linux ist viel zu kompliziert als dass man da groß Zeit für investieren sollte finde ich.
|
AW: Exaktes Filecopy für Windows und Android
@skoschke: Die zweiten Codeteile von mir nutzen nur IOUtils. Klappt da was nicht auf non-Windows? Ich habe da keine Erfahrung.
|
AW: Exaktes Filecopy für Windows und Android
Zitat:
|
AW: Exaktes Filecopy für Windows und Android
Genau diesen Eindruck hatte ich auch, aber ich kann es halt nicht nachmachen.
Danke für Aufklärung! Ps: Mir fehlen da auch Grundlagenkenntnisse für non-Windows und was da für Attribute/Datumstempel tatsächlich existieren/berücksichtigt werden müssen, an TE bitte vorher informieren, meine Basics zeigen nur Windows Möglichkeiten um was so genau wie möglich dem original nachzuempfinden. PPs: Dieses Thema gehört nicht nach WinApi :-] |
AW: Exaktes Filecopy für Windows und Android
Inzwischen war Post #5 entstanden, klingt hervorragend!
Erst kopieren und dann per
Delphi-Quellcode:
die gewünschten Angaben anpassen, würde auch unter Android compilierbar sein, aber:
...
sor := 'c:\tmp\Neu.txt'; des := 'c:\tmp\Neu_2.txt'; TFile.Copy(sor, des, true); dt := TFile.GetCreationTime(sor); TFile.SetCreationTime(des, dt); dt := TFile.GetCreationTime(des); TFile.SetCreationTimeUtc(des, dt); dt := TFile.GetLastAccessTime(sor); TFile.SetLastAccessTime(des, dt); dt := TFile.GetLastWriteTime(sor); TFile.SetLastAccessTimeUtc(des, dt); dt :=TFile.GetLastWriteTime(sor); TFile.SetLastWriteTime(des,dt); dt:=TFile.GetLastWriteTimeUtc(sor); tfile.SetLastWriteTimeUtc(des,dt); Ich erstelle die Datei Neu.txt im Explorer, deren Anderungsdatum ist heute 14:22 (stimmt), das Erstelldatum aber heute 14:14 ???? Die kopierte Datei hat das Änderungsdatum wie die Originaldatei, als Erstelldatum aber 15:14 (in der Zukunft!) Ich krieg die Krise! Warum das denn nun? Ciao Stefan |
AW: Exaktes Filecopy für Windows und Android
Delphi-Quellcode:
im vorigen posting war ein Vertipper per copy/paste, die Datumsangaben sind nun identisch für beide Dateien, unklar ist aber warum die Datei 8 Minuten vor ihrer Erzeugung erstellt wurde!
dt := TFile.GetCreationTime(sor);
TFile.SetCreationTime(des, dt); dt := TFile.GetCreationTimeUtc(des); TFile.SetCreationTimeUtc(des, dt); dt := TFile.GetLastAccessTime(sor); TFile.SetLastAccessTime(des, dt); dt := TFile.GetLastAccessTimeUtc(sor); TFile.SetLastAccessTimeUtc(des, dt); dt := TFile.GetLastAccessTime(sor); TFile.SetLastAccessTime(des, dt); dt := TFile.GetLastAccessTimeUtc(sor); TFile.SetLastAccessTimeUtc(des, dt); dt :=TFile.GetLastWriteTime(sor); TFile.SetLastWriteTime(des,dt); dt:=TFile.GetLastWriteTimeUtc(sor); tfile.SetLastWriteTimeUtc(des,dt); Ciao Stefan |
AW: Exaktes Filecopy für Windows und Android
Schreib dir am besten einen Wrapper für all das oder so. Auf die Existenz der Quelldatei muss geprüft werden sonst kracht es.
|
AW: Exaktes Filecopy für Windows und Android
Lass mal unter Windows das ganze UTC gedöns raus. Bei mir klappt es.
|
Dieses Thema wurde am "30. Nov 2018, 18:56 Uhr" von "Luckie" aus dem Forum "Win32/Win64 API (native code)" in das Forum "Cross-Platform-Entwicklung" verschoben.
|
AW: Exaktes Filecopy für Windows und Android
Zitat:
Im Gegensatz dazu besitzt Windows beliebig komplexe ACLs. Jede Datei kann theoretisch dutzende verschiedene Rechte haben, jeweils mit anderen Nutzern oder Gruppen, namentlich oder per Konstante, mit oder ohne Vererbung von übergeordneten Rechte. Jetzt wundert mich auch nicht mehr, warum Du so gegen Lazarus mobbst ;) Ich weiß leider nicht, wie das unter Delphi geht, aber unter FreePascal ist das simpel: ![]() ![]() Und schon wären die Berechtigungen kopiert. Mit Windows & ACLs dagegen kann man das exakte Kopieren von Rechten nicht einmal nur auf die Datei bezogen definieren (was auch Vorteile hat). |
AW: Exaktes Filecopy für Windows und Android
Ne, gegen Lazurus mobbe ich nur, weil die IDE nicht zeitgemäß ist und das schon lange nicht mehr.
Bei Lazurus habe ich den Eindruck Wo viele Hände dran arbeiten, entsteht viel Chaos Vielleicht gibt es in einem Jahr oder so ja endlich den Android Compiler für die Community-Edition. Das wäre ein Traum. |
AW: Exaktes Filecopy für Windows und Android
Zitat:
|
AW: Exaktes Filecopy für Windows und Android
.. Du könntest auch die Hashes (md5, sha256,..) der beiden Dateien vergleichen.
Das ist meines Wissens das Datum der Datei unerhebich. Grüße Klaus |
AW: Exaktes Filecopy für Windows und Android
@Klaus01: es geht ihm aber um "ein Cloudsystem", das vergleicht. Er will nicht selber vergleichen, sondern einen vorhandenen Vergleich positiv erfüllen. Siehe Eingangspost.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:19 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