Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   CopyFile Datei wird nicht überschrieben (https://www.delphipraxis.net/186916-copyfile-datei-wird-nicht-ueberschrieben.html)

Sir Rufo 14. Okt 2015 09:02

AW: CopyFile Datei wird nicht überschrieben
 
Also das funktioniert ganz wunderbar
Delphi-Quellcode:
uses
  System.IOUtils,
  System.SysUtils,
  System.Types;

procedure CopyFiles(
  const SourceFiles     : array of string;
  const DestinationFolder: string;
  FileExistsCallback    : TFunc<string, Boolean>;
  FileFailCallback      : TProc<string, string> );
var
  Index        : Integer;
  Source, Target: string;
  FailIfExists : Boolean;
  LastError    : Cardinal;
begin
  for index := low( SourceFiles ) to high( SourceFiles ) do
    begin
      Source      := SourceFiles[ index ];
      Target      := TPath.Combine( DestinationFolder, TPath.GetFileName( Source ) );
      FailIfExists := True;

      while True do
        begin
          if not CopyFile( PChar( Source ), PChar( Target ), FailIfExists )
          then
            begin
              LastError := GetLastError;
              if ( LastError <> ERROR_FILE_EXISTS ) or not FailIfExists
              then
                begin
                  FileFailCallback( Source, SysErrorMessage( LastError ) );
                  Break;
                end;

              if not FileExistsCallback( Source )
              then
                begin
                  FileFailCallback( Source, 'UserChoice' );
                  Break;
                end;

              FailIfExists := False;
            end
          else
            Break;
        end;
    end;
end;

procedure TForm1.Button1Click( Sender: TObject );
var
  SourceFiles     : TStringDynArray;
  DestinationFolder: string;
begin
  SourceFiles      := TDirectory.GetFiles( TPath.GetDocumentsPath );
  DestinationFolder := TPath.GetTempPath;

  ListBox1.Items.Clear;

  CopyFiles( SourceFiles, DestinationFolder,
    function( Filename: string ): Boolean
    begin
      ListBox1.Items.Add( 'EXISTS: ' + Filename );
      Result := MessageDlg(
        {} string.Format( 'Die Datei %s existiert bereits' + sLineBreak + 'Soll diese überschrieben werden?', [ Filename ] ),
        {} mtWarning,
        {} mbYesNo,
        {} 0 ) = mrYes;
    end,
    procedure( Filename, Reason: string )
    begin
      ListBox1.Items.Add( 'FAILS: ' + Filename + ' REASON: ' + Reason );
    end );
end;

ergo2000 14. Okt 2015 09:04

AW: CopyFile Datei wird nicht überschrieben
 
Ersetze doch einfach mal CopyFile(... mit IOUtils.TFile.Copy(...
vielleicht so:

Delphi-Quellcode:
...
uses IOUtils, ...

function IO_CopyFile(dQuelle,dZiel:string):boolean;
begin
 Result:=false;
 if IOUtils.TFile.Exists(ExtractFilePath(dQuelle) + ExtractFileName(dQuelle)) then
     try
       //falls das Ziel-VZ nicht existiert, dann erstellen:
        if not TDirectory.Exists(ExtractFilePath(dZiel)) then
                                   IOUtils.TDirectory.CreateDirectory(ExtractFilePath(dZiel));
                 
      IOUtils.TFile.Copy(dQuelle,dZiel,true);

.....
      Result:=true;
....
     except
     end;
end;
Bei mir funktioniert diese Variante unter allen Windows-Versionen einwandfrei. Mit copyfile(... hatte ich zuvor auch gelegentlich so einige "Probleme".

Ralf

Dennis07 14. Okt 2015 11:59

AW: CopyFile Datei wird nicht überschrieben
 
Alles klar, danke. Beide wege funktionieren komischerweise. :)
Scheint wohl tatsächlich Probleme zu machen, die CopyFile-Methode...

Problem gelöst, danke!

Sir Rufo 14. Okt 2015 12:28

AW: CopyFile Datei wird nicht überschrieben
 
Zitat:

Zitat von Dennis07 (Beitrag 1318661)
Alles klar, danke. Beide wege funktionieren komischerweise. :)
Scheint wohl tatsächlich Probleme zu machen, die CopyFile-Methode...

Problem gelöst, danke!

:gruebel: ich verwende aber
Delphi-Quellcode:
CopyFile
... ohne Probleme. Dann scheint das Problem wohl doch in deinem Code zu sein, gelle?

Dennis07 14. Okt 2015 20:30

AW: CopyFile Datei wird nicht überschrieben
 
Zitat:

Zitat von Sir Rufo (Beitrag 1318670)
:gruebel: ich verwende aber
Delphi-Quellcode:
CopyFile
... ohne Probleme. Dann scheint das Problem wohl doch in deinem Code zu sein, gelle?

Naja, aber dann wohl nicht nur in meinem. Denn alle anderen Lösungen hier funzten genauso wenig :zwinker:

Sir Rufo 14. Okt 2015 20:34

AW: CopyFile Datei wird nicht überschrieben
 
Zitat:

Zitat von Dennis07 (Beitrag 1318724)
Zitat:

Zitat von Sir Rufo (Beitrag 1318670)
:gruebel: ich verwende aber
Delphi-Quellcode:
CopyFile
... ohne Probleme. Dann scheint das Problem wohl doch in deinem Code zu sein, gelle?

Naja, aber dann wohl nicht nur in meinem. Denn alle anderen Lösungen hier funzten genauso wenig :zwinker:

Es gibt halt mehr falsch als richtig, darum ist die Trefferquote für richtig auch so gering.

Die Hinweise hier waren aber so gesehen richtig. Wie du die umgesetzt hast kann ich nicht beurteilen.

Macht man alles richtig, funktioniert es im Normalfall auch ;)

Dennis07 14. Okt 2015 22:27

AW: CopyFile Datei wird nicht überschrieben
 
Zitat:

Zitat von Sir Rufo (Beitrag 1318726)
Die Hinweise hier waren aber so gesehen richtig.

Hab ich auch nie in Frage gestellt. :)

Zitat:

Zitat von Sir Rufo (Beitrag 1318726)
Wie du die umgesetzt hast kann ich nicht beurteilen.

Copy & paste... :D

Zitat:

Zitat von Sir Rufo (Beitrag 1318726)
Macht man alles richtig, funktioniert es im Normalfall auch

Der "Normalfall"... jaja, das geile daran ist ja dass der selbst so gut wie nie eintrifft...

Lyan 21. Okt 2015 19:00

AW: CopyFile Datei wird nicht überschrieben
 
Ohne jetzt alle 26 Antworten gelesen zu haben, meine erste Vermutung wäre dass das FailIfExists der Fehler ist.

Wenn ich mich nicht irre, dann ploppt die MsgBox auf "Möchten sie die datei übschreiben [...] ?" [Yes, No].

Wenn man dort dann Yes auswählt, dann wird true zurückgeliefert, was die Variable FailIfExist auch auf true setzt.

Demnach wird bei CopyFile(,,True) übergeben und somit failed logischreweise das Replace.

Sir Rufo 21. Okt 2015 20:54

AW: CopyFile Datei wird nicht überschrieben
 
Nein, wenn dort Yes ausgewählt wird, dann wird
Delphi-Quellcode:
mrYes
zurückgeliefert und dann wird
Delphi-Quellcode:
FailIfExists := MessageDlg(...) <> mrYes;
eben
Delphi-Quellcode:
false
.

delnu 21. Okt 2015 21:36

AW: CopyFile Datei wird nicht überschrieben
 
Weil ich zwar nicht neugierig bin, aber immer alles wissen möchte: :lol:

Läßt sich mal der KOMPLETTE Code von Dennis07 erhalten ?

Zwar habe ich nur maximal XP und Delphi 7, aber es wäre immerhin möglich, daß
er etwas benutzt, das mit so alten Sachen noch funktioniert ... :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 Uhr.
Seite 3 von 4     123 4      

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