Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Dateien kopieren (https://www.delphipraxis.net/106261-dateien-kopieren.html)

Masteric 8. Jan 2008 00:20


Dateien kopieren
 
Hi Experten,
ich habe ein Frage zu folgender Function:

Delphi-Quellcode:
function CopyFileEx(const ASource, ADest: String; rooten:string;
 ARenameCheck: boolean = true): boolean;
var
  sh: TSHFileOpStruct;
begin
  ForceDirectories(rooten);

 sh.Wnd := Application.Handle;
  sh.wFunc := FO_COPY;

  // String muss mit #0#0 Terminiert werden, um das Listenende zu setzen
  sh.pFrom := PChar(ASource + #0);
  sh.pTo := PChar(ADest + #0);
  sh.fFlags := fof_Silent or fof_MultiDestFiles;
  if ARenameCheck then
    sh.fFlags := sh.fFlags or fof_RenameOnCollision;
  Result:=ShFileOperation(sh)=0;
end;
Diese Function kopiert Datein eigentlich sehr gut, da die einfachere Version
Function Copyfile(src,dest,overwrite); bei mir irgendwie nicht funktioniert.

Jetzt ist es aber so, dass die Function oben, eine Kopie einer Datei anlegt,
wenn diese schon existiert. Ich will aber, dass es die Datei überschreibt, ohne
irgendeinen Eingriff, da es um ein Synchronisationsprogramm geht und es da dumm ist,
wenn der Nutzer jede Datei bestätigen muss, die sich geändert hat.

Kann mir jemand bitte sagen, was ich ändern muss, damit die Function keine Kopie anlegt
und auch nicht auf ein "Wollen Sie die Datei wirklich überschreiben?" Fenster öffnent?

Denke mal, dass man hier

Delphi-Quellcode:
 if ARenameCheck then
    sh.fFlags := sh.fFlags or fof_RenameOnCollision;
  Result:=ShFileOperation(sh)=0;
was ändern muss, habe aber leider nicht so viel Ahnung von der Windows API.

Hoffe Ihr wisst Rat. :-D



Gruß Masteric


PS: Die Variable Rooten die ich mir noch nachträglich eingebaut hab, sorgt dafür, dass das Unterverzeichniss
der zu Kopierenden Datei erstellt wird, wenn es noch nicht vorhanden ist.

PS: Er kopiert oftmals auch verschiedene Datein nicht, die aber manuell einfach kopiert werden können, wer also
eine gut funktionierende Methode hat, kann sie gerne auch Posten :-D .


[edit=Matze]Es heißt "Dateien", nicht "Datein". Damit man das Thema über die Suchfunktion findet, habe ich den Tittel korrigiert. MfG, Matze[/edit]

Tommy82 8. Jan 2008 07:23

Re: Datein kopieren
 
Hallo,

probier mal das:

Delphi-Quellcode:
function CopyFileEx(const ASource, ADest: String; rooten:string;
ARenameCheck: boolean = true): boolean;
var
  sh: TSHFileOpStruct;
begin
  ForceDirectories(rooten);

sh.Wnd := Application.Handle;
  sh.wFunc := FO_COPY;

  // String muss mit #0#0 Terminiert werden, um das Listenende zu setzen
  sh.pFrom := PChar(ASource + #0);
  sh.pTo := PChar(ADest + #0);
  sh.fFlags := fof_Silent or fof_MultiDestFiles or FOF_NOCONFIRMATION; // Wichtig ist das "or FOF_NOCONFIRMATION;"
  if ARenameCheck then
    sh.fFlags := sh.fFlags or fof_RenameOnCollision;
  Result:=ShFileOperation(sh)=0;
end;
mfg

Tommy82

Masteric 8. Jan 2008 10:35

Re: Dateien kopieren
 
danke :thumb: das funktioniert super!

Darauf wäre ich auch echt nicht gekommen, ich hatte ja in der Zeile darunter probiert etwas zu ändern



Gruß Masteric

Christian Seehase 8. Jan 2008 11:16

Re: Dateien kopieren
 
Moin Masteric,

Du solltest Dir einfach mal die Dokumentation der möglichen Flags im PSDK anschauen (MSDN-Library durchsuchenSHFILEOPSTRUCT).
Ausserdem wäre es ganz gut, die Struktur zu Beginn einmal zu initialisieren:

Delphi-Quellcode:
FillChar(sh,SizeOf(sh),0);
Das ForceDirectories müsstest Du Dir eigentlich auch sparen können, wobei Du evtl. noch FOF_NOCONFIRMMKDIR bei den Flags hinzufügen müsstest.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:43 Uhr.

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