![]() |
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.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:23 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