Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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)

Dennis07 11. Okt 2015 18:26

CopyFile Datei wird nicht überschrieben
 
Hallo,
ich habe mal wieder ein Problem. Und zwar möchte ich eine Datei Kopieren und gegebenenfalls überscheiben.
Hierzu nutze ich die Funktion "CopyFile(...)".
Ich weise den Parameter "FailIfExists" durch das ergebnis eines MessageDlg's zu.
Das ganze sieht wie Folgt aus:

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;
Es wird eine Datei kopiert, falls die Zieldatei nicht vorhanden ist. Außerdem wird die Variable "FailIfExists" korrekt zugewiesen (True, falls die Datei nicht überschrieben werden soll und False, falls die Datei überschrieben werden soll). Allerdings wird die Datei, auch wenn "FailIfExists" auf False steht, nicht überschrieben. "RaiseLastOSError" zeigt nichts verdächtiges an und es wird auch in den virtualisierten Verzeichnissen nichts angelegt.

Könnte mir jemand sagen, woran dies liegt?

Danke!

zeras 11. Okt 2015 18:46

AW: CopyFile Datei wird nicht überschrieben
 
Ich kann zwar im Moment nicht testen, aber solche Konstrukte wie

Delphi-Quellcode:
if ListBox1.Selected[Index] = True then
kommen nicht immer gut.
Nimm einfach

Delphi-Quellcode:
if ListBox1.Selected[Index]then
bei allen boolschen Vergleichen.
Das kommt bei dir öfters vor.

Auch sollte man, wenn man eine Variable mehrmals verwendet, diese erst einmal zwischenspeichern. Das erhöht die Übersicht.
Beispielsweise kommt
Delphi-Quellcode:
ListBox1.Items.Strings[Index]
öfters vor.
Nimm eine lokale Variable, bsp.
Delphi-Quellcode:
Filename := ListBox1.Items.Strings[Index]
und ersetze die weiteren Abfragen dann immer mit Filename.

Dennis07 11. Okt 2015 18:58

AW: CopyFile Datei wird nicht überschrieben
 
Ja, grundsätzlich ist das aber egal.
Außerdem habe ich bereits überprüft, "FailIfExists" ist/wird korrekt gesetzt. Daran liegt es nicht. Die "CopyFile"-Methode ansich scheint Probleme zu machen.

zeras 11. Okt 2015 19:00

AW: CopyFile Datei wird nicht überschrieben
 
Zitat:

Zitat von Dennis07 (Beitrag 1318335)
Ja, grundsätzlich ist das aber egal.

Da wirst du im Forum etliche Einträge finden, dass es NICHT egal ist!

Dennis07 11. Okt 2015 19:18

AW: CopyFile Datei wird nicht überschrieben
 
Ich meinte damit nicht, dass es "komplett egal" sei, sondern dass es für dieses Szenario keinen Unterschied macht. Und das stimmt auch. Das ganze hat afaik nur eine auswirkung auf manche API-Sachen wegen der BOOL-Boolean-Inkompatibilität. Bei nativer VCL ist das aber soweit ich weiß sowieso irrelevant. Und wenn man die Vergleiche mit True weglässt, kommt man ja auch aufs selbe Ergebnis. Nähmlich, dass CopyFile nicht überschreibt.

zeras 11. Okt 2015 19:35

AW: CopyFile Datei wird nicht überschrieben
 
Ändere doch mal die letzte Zeile Copyfile wie unten beschrieben und schaue dir die Strings an. Dann wirst du merken, dass deine Dateinamensangaben nicht passen. Du nimmst gleich den neuen Namen, anstatt den Quellnamen.

Delphi-Quellcode:

var

  s1, s2: String;


....
     s1 := CurrentFolder + '\' + ChangeFileExt(fName,'.txt');
      s2 := NewFolder + ChangeFileExt(fName,'.txt');
      if not CopyFile(PChar(s1), PChar(s2), FailIfExists)then
  ShowMessage('Fehler beim Erstellen der Kopie!'#13#10 + SysErrorMessage(GetLastError));

Dennis07 11. Okt 2015 19:44

AW: CopyFile Datei wird nicht überschrieben
 
Nein. Hatte aber bereits auch schon gesagt, dass kein Fehler auftritt und die Funktion "True" zurückgibt. Trotzdem wird die Datei nicht überschrieben.
Und die Namen passen soweit. Beim erstmaligen Kopieren (wo die Zieldatei ja noch nicht existiert) passt es ja auch und die Datei wird problemlos kopiert.

zeras 11. Okt 2015 20:03

AW: CopyFile Datei wird nicht überschrieben
 
Und was bringt ShowMessage hinter dem Copyfile?

Dennis07 11. Okt 2015 20:13

AW: CopyFile Datei wird nicht überschrieben
 
Wie ich bereits sagte: Es wird nicht aufgerufen, wenn die Datei noch nicht existiert oder wenn diese überscrhieben werden soll.
Und wenn diese nicht überschrieben werden soll, dann wird ShowMessage aufgerufen und zeigt an, dass die Zieldatei bereits existiert und deswegen nicht Kopiert werden kann.
Also soweit alles im grünen Bereich ohne Auffälligkeiten.
Nur, wird die Datei halt nicht überschrieben, wenn sie das eigentlich sollte.

zeras 11. Okt 2015 20:26

AW: CopyFile Datei wird nicht überschrieben
 
Wenn Copyfile nicht erfolgreich ist, muss ShowMessage aufgerufen werden mit

Delphi-Quellcode:
SysErrorMessage(GetLastError));
Da siehst du, warum das fehlschlug.
Bitte deinen Code entsprechend ändern, wie von mir oben beschrieben und die Meldung posten.

Außerden wird FailIfExists nicht initialisiert. Das sollte auch gemacht werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:10 Uhr.
Seite 1 von 4  1 23     Letzte »    

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