![]() |
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:
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.
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; Könnte mir jemand sagen, woran dies liegt? Danke! |
AW: CopyFile Datei wird nicht überschrieben
Ich kann zwar im Moment nicht testen, aber solche Konstrukte wie
Delphi-Quellcode:
kommen nicht immer gut.
if ListBox1.Selected[Index] = True then
Nimm einfach
Delphi-Quellcode:
bei allen boolschen Vergleichen.
if ListBox1.Selected[Index]then
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:
öfters vor.
ListBox1.Items.Strings[Index]
Nimm eine lokale Variable, bsp.
Delphi-Quellcode:
und ersetze die weiteren Abfragen dann immer mit Filename.
Filename := ListBox1.Items.Strings[Index]
|
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. |
AW: CopyFile Datei wird nicht überschrieben
Zitat:
|
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.
|
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)); |
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. |
AW: CopyFile Datei wird nicht überschrieben
Und was bringt ShowMessage hinter dem Copyfile?
|
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. |
AW: CopyFile Datei wird nicht überschrieben
Wenn Copyfile nicht erfolgreich ist, muss ShowMessage aufgerufen werden mit
Delphi-Quellcode:
Da siehst du, warum das fehlschlug.
SysErrorMessage(GetLastError));
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 19:59 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 by Thomas Breitkreuz