Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Exaktes Filecopy für Windows und Android (https://www.delphipraxis.net/198794-exaktes-filecopy-fuer-windows-und-android.html)

skoschke 30. Nov 2018 09:53


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

DieDolly 30. Nov 2018 09:59

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.

KodeZwerg 30. Nov 2018 10:07

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.

CCRDude 30. Nov 2018 11:45

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.

KodeZwerg 30. Nov 2018 12:24

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 ) );

DieDolly 30. Nov 2018 12:27

AW: Exaktes Filecopy
 
Kleiner Hinweis. Bei TFile.WasWeißIch sollte man vorher immer auf Exist prüfen.

KodeZwerg 30. Nov 2018 12:42

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 :)

skoschke 30. Nov 2018 12:53

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

DieDolly 30. Nov 2018 12:56

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.

KodeZwerg 30. Nov 2018 12:58

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.

Uwe Raabe 30. Nov 2018 13:01

AW: Exaktes Filecopy für Windows und Android
 
Zitat:

Zitat von KodeZwerg (Beitrag 1419778)
Die zweiten Codeteile von mir nutzen nur IOUtils. Klappt da was nicht auf non-Windows?

Die Routinen aus IOUtils sollten auf allen Plattformen funktionieren.

KodeZwerg 30. Nov 2018 13:12

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 :-]

skoschke 30. Nov 2018 13:27

AW: Exaktes Filecopy für Windows und Android
 
Inzwischen war Post #5 entstanden, klingt hervorragend!

Erst kopieren und dann per

Delphi-Quellcode:
...
  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);
die gewünschten Angaben anpassen, würde auch unter Android compilierbar sein, aber:

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

skoschke 30. Nov 2018 13:32

AW: Exaktes Filecopy für Windows und Android
 
Delphi-Quellcode:
  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);
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!

Ciao
Stefan

DieDolly 30. Nov 2018 13:34

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.

KodeZwerg 30. Nov 2018 13:36

AW: Exaktes Filecopy für Windows und Android
 
Lass mal unter Windows das ganze UTC gedöns raus. Bei mir klappt es.

DP-Maintenance 30. Nov 2018 17:56

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.

CCRDude 30. Nov 2018 18:15

AW: Exaktes Filecopy für Windows und Android
 
Zitat:

Zitat von DieDolly (Beitrag 1419777)
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.

Ein Besitzer, eine Gruppe. Besitzer, Gruppe und Alle haben Rechte (oder nicht) zu Lesen, Schreiben, Ausführen.

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:
https://www.freepascal.org/docs-html...x/fpchown.html
https://www.freepascal.org/docs-html...x/fpchmod.html
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).

DieDolly 30. Nov 2018 18:16

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.

KodeZwerg 30. Nov 2018 19:19

AW: Exaktes Filecopy für Windows und Android
 
Zitat:

Zitat von skoschke (Beitrag 1419789)
Delphi-Quellcode:

if ( TFile.Exists( Sor ) and TFile.Exists( Des ) ) then
begin
{$IFDEF WINDOWS}
  TFile.SetCreationTime( Des, TFile.GetCreationTime( Sor ) );
  TFile.SetLastAccessTime( Des, TFile.GetLastAccessTime( Sor ) );
  TFile.SetLastWriteTime( Des, TFile.GetLastWriteTime( Sor ) );
{$ELSE WINDOWS}
  TFile.SetCreationTimeUtc( Des, TFile.GetCreationTimeUtc( Sor ) );
  TFile.SetLastAccessTimeUtc( Des, TFile.GetLastAccessTimeUtc( Sor ) );
  TFile.SetLastWriteTimeUtc( Des, TFile.GetLastWriteTimeUtc( Sor ) );
{$ENDIF WINDOWS}
  TFile.SetAttributes( Des, TFile.GetAttributes( Sor ) );
end;

So hier könnte es richtig sein.

Klaus01 2. Dez 2018 09:04

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

CCRDude 2. Dez 2018 13:02

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