AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) CopyFile Datei wird nicht überschrieben

CopyFile Datei wird nicht überschrieben

Ein Thema von Dennis07 · begonnen am 11. Okt 2015 · letzter Beitrag vom 22. Okt 2015
Antwort Antwort
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#1

AW: CopyFile Datei wird nicht überschrieben

  Alt 12. Okt 2015, 11:04
Delphi-Quellcode:
var
  Index: Integer;
  NewFolder: String;
  FailIfExists: Boolean;
begin
  NewFolder := GetEnvironmentVariable('USERPROFILE') + '\Documents\';
  for Index := 0 to ListBox1.Items.Count - 1 do
  begin
    if ListBox1.Selected[Index] = True then
    begin
      if FileExists(NewFolder + ChangeFileExt(ListBox1.Items.Strings[Index],'.txt')) = True then
      begin
        FailIfExists := (MessageDlg('Die Datei "' + ListBox1.Items.Strings[Index] + '" existiert bereits.' + sLineBreak + 'Soll diese überschieben werden?',mtWarning,mbYesNo,0) <> mrYes);
      end;
      CopyFile(PChar(CurrentFolder + '\' + ChangeFileExt(ListBox1.Items.Strings[Index],'.txt')),PChar(NewFolder + ChangeFileExt(ListBox1.Items.Strings[Index],'.txt')),FailIfExists);
    end;
  end;
was passiert den in dem vollkommen unwahrscheinlichen Fall, daß es NewFolder + ChangeFileExt(ListBox1.Items.Strings[Index],'.txt' nicht gibt?

Richtig,  CopyFile arbeitet mit einem zufälligen Wert der in FailIfExists steht.

(woher kommt eigentlich diese unsägliche Unsitte "if irgendwas = True" ? gibt es irgendeinen Java oder BASCIC -Dialekt der das so benötigt?)

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (12. Okt 2015 um 11:08 Uhr)
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
492 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: CopyFile Datei wird nicht überschrieben

  Alt 12. Okt 2015, 16:03
was passiert den in dem vollkommen unwahrscheinlichen Fall, daß es NewFolder + ChangeFileExt(ListBox1.Items.Strings[Index],'.txt' nicht gibt?
Kannst du nicht wissen, kann aber nicht passieren. Das hat was damit zu tun, wie ich an die Einträge der Listbox komme. Ich hab hier ja nicht mein gesammtes Programm gepostet..

woher kommt eigentlich diese unsägliche Unsitte "if irgendwas = True" ? gibt es irgendeinen Java oder BASCIC -Dialekt der das so benötigt?
Nicht wirklich, nein. Ist noch ne dumme angewohnheit, die ich aus Assembly übernommen hatte. Mal sehen, vielleicht gewöhn ich mir das wieder ab...
Dennis
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: CopyFile Datei wird nicht überschrieben

  Alt 13. Okt 2015, 03:14
Hallo,
wie ist der Rückgabewert von CopyFile und GetLastError?

Hier noch mal die Beschreibung:

https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx


Heiko
Heiko
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
492 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: CopyFile Datei wird nicht überschrieben

  Alt 13. Okt 2015, 16:38
Hatte ich bereits oben mehrfach gepostet. Egal, ich lösche die Datei jetzt einfach, falls dieses erwünscht ist und dann wird sie komplett neu erstellt beim Kopieren, oder halt nicht. Das klappt problemlos.
Danke trotzdem für eure Hilfe!

MfG
Dennis
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: CopyFile Datei wird nicht überschrieben

  Alt 14. Okt 2015, 04:26
Hallo,
es ist trotzdem schade, dass du keine der Hilfen annimmst,
wie z.B. mal lokale Variablen zu benutzen.
FailIfExists ist nicht initialisiert, wenn die Datei nicht existiert.

Mach das ganze doch auch für Dich und uns übersichtlicher und stell den Code noch mal hier rein.

Mit SearchEverything kannst du sehr schnell nach einer Datei suchen,
wer weiß, wo die ist . . .

Heiko
Heiko

Geändert von hoika (14. Okt 2015 um 04:33 Uhr)
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
492 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: CopyFile Datei wird nicht überschrieben

  Alt 14. Okt 2015, 07:34
Denkst du, das habe ich nicht?
Ich war schon bevor ich hier gepostet habe so weit, dass ich wusste, dass es an der CopyFile-Methode selbst liegen muss. Scheinbar irgendwas auf meinem System ist da Fehlerhaft. Die Variablen stimmen und es werden die Methoden und Variablen korrekt konfiguriert. Auch die Lösungswege, die ihr geostet habt (die im grunde identisch sind mit dem, was ich sonst noch so versucht habe) funktionierten nicht.
Dennis
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: CopyFile Datei wird nicht überschrieben

  Alt 14. Okt 2015, 09:02
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
ergo2000

Registriert seit: 21. Jan 2013
Ort: Berlin
4 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: CopyFile Datei wird nicht überschrieben

  Alt 14. Okt 2015, 09:04
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
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:31 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