Delphi-PRAXiS
Seite 1 von 3  1 23      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:56 Uhr.
Seite 1 von 3  1 23      

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