Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Problem mit CopyFile


hRb - Do 28.03.19 22:58
Titel: Problem mit CopyFile
Hallo,
ich schlage mich mit der CopyFile-Funktion herum. Habe ein Programm das Dateien kopiert und nutze bisher folgende Funktion (gekürzt und alle try-except, Result zur Übersicht weggelassen)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function FileCopy(sVon,sNach: String ):  Boolean;
 var S,D: TFileStream;    // Source & Destination
begin {FileCopy}
  Result := False;
  S := TFileStream.Create(sVon, fmOpenRead );
  D := TFileStream.Create(sNach, fmOpenWrite or fmCreate );
  D.CopyFrom(S, S.Size ) ;
  D.Free;
  S.Free;
end;

Dieser Tage scheiterte ich bei großen Dateien, Funktion kommt möglicherweise an ihre Grenzen?. Habe mp4-Datei > 3 GB kopiert. Hier wird die Routine nicht mehr fertig, liefert aber auch keine Anzeigen. Wollte nun die CopyFile-Funktion nutzen. Hier finde ich in einem Forum folgende Funktion, die mir gleichzeitig die Arbeit der Datumsanpassung abnehmen würde.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
type
 TCopyFileFlag = (cffOverwriteFile, cffCreateDestDirectory, cffPreserveTime );
 TCopyFileFlags = set of TCopyFileFlag;
 
function CopyFile(const SrcFilename, DestFilename: string): boolean;
function CopyFile(const SrcFilename, DestFilename: string; PreserveTime: boolean): boolean;
function CopyFile(const SrcFilename, DestFilename: string; Flags: TCopyFileFlags=[cffOverwriteFile]): boolean;

uses 
...
fileutil
...

CopyFile(SourceName, DestName, [cffPreserveTime, cffOverwriteFile]);

Mein Problem: Es wird Uses FileUtil benötigt. Ich arbeite mit RAD-Studio Berlin 10.2. Dieser Compiler stellt diese Funktion nicht bereit.
Mein zweiter Versuch war, mit einer Microsoft-Routine zu arbeiten

Delphi-Quelltext
1:
2:
3:
4:
5:
BOOL CopyFile(
  LPCTSTR lpExistingFileName,
  LPCTSTR lpNewFileName,
  BOOL    bFailIfExists
);

Beim Befehl

Delphi-Quelltext
1:
if CopyFile(sVon, sNach, false) = 0 then                    

meckert auch hier der Compiler mit: E2010 Inkompatible Typen: 'PWideChar' und 'string'. Dabei werden Pfadnamen doch imer als String übergeben.
Kann mir jemand zur einen oder anderen Variante hilfreiche Tipps geben, damit ich zumindest mal compilieren und testen kann.
MfG hRb


Delete - Do 28.03.19 23:35

- Nachträglich durch die Entwickler-Ecke gelöscht -


hRb - Do 28.03.19 23:53

Hallo Frühlingsrolle,
warst mal wieder schneller!!! Habe gerade noch etwas entdeckt, was auch funktioniert:

Delphi-Quelltext
1:
if CopyFile(@sVon[1], @sNach[1], false) = false then ...                    

Habe tatsächlich den Eindruck, dass diese Funktion deutlich schnelller ist und vor allem zu Ende kommt. Werde mir auch noch CopyFile2 ansehen und ggf. Fortschritttsanzeige einblenden.
Jedenfalls Danke
hRb


Delete - Fr 29.03.19 00:14

- Nachträglich durch die Entwickler-Ecke gelöscht -


Sinspin - So 31.03.19 14:04

Hallo,

ich arbeite mit WinApi.ShellAPI -> SHFileOperation [https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-shfileoperationa]. Ist die Schnittstelle zur Windows eigenen Routine zum kopieren, verschieben, löschen.
Eine neuere Variante ist IFileOperation. Aber MS weißt selber darauf hin dass die Interface Implementierung nicht Threadsave ist und man in dem Fall bei SHFileOperation bleiben soll.


hRb - Do 04.04.19 23:17

Danke, wieder was gelernt.
hRb