![]() |
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. |
AW: CopyFile Datei wird nicht überschrieben
Zitat:
Zitat:
|
AW: CopyFile Datei wird nicht überschrieben
Räum deinen Code doch erst mal auf. Speicher den zusammengebastelten Pfad mal in einer Variablen zwischen. Dann guckst du mal, ob da auch das drin steht, was du erwartest.
|
AW: CopyFile Datei wird nicht überschrieben
Zitat:
Übrigens empfehle ich, die Funktion Format() zu benutzen, um Pfade zusammenzusetzen, denn solche String-Zusammensetzungs-Orgien sind überaus unübersichtlich. Weiterhin empfehle ich, davon Abstand zu nehmen, Standardpfade aus Umgebungsvariablen zu ermitteln, denn dafür gibt es passende Funktionen (SHGetSpecialFolderPath und wie sie alle heißen); das schließt auch das bei dir hartcodierte Verzeichis "Documents" mit ein. MfG Dalai |
AW: CopyFile Datei wird nicht überschrieben
Oh, danke, wusst ich gar nicht, das mit dem SHFolderDingsta... werd ich mir mal ansehen, danke.
|
AW: CopyFile Datei wird nicht überschrieben
Delphi-Quellcode:
was passiert den in dem vollkommen unwahrscheinlichen Fall, daß es
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;
Delphi-Quellcode:
nicht gibt?
NewFolder + ChangeFileExt(ListBox1.Items.Strings[Index],'.txt'
Richtig,
Delphi-Quellcode:
arbeitet mit einem zufälligen Wert der in
CopyFile
Delphi-Quellcode:
steht.
FailIfExists
(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 |
AW: CopyFile Datei wird nicht überschrieben
Zitat:
Zitat:
|
AW: CopyFile Datei wird nicht überschrieben
Hallo,
wie ist der Rückgabewert von CopyFile und GetLastError? Hier noch mal die Beschreibung: ![]() Heiko |
AW: CopyFile Datei wird nicht überschrieben
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 |
AW: CopyFile Datei wird nicht überschrieben
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 |
AW: CopyFile Datei wird nicht überschrieben
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. |
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; |
AW: CopyFile Datei wird nicht überschrieben
Ersetze doch einfach mal CopyFile(... mit IOUtils.TFile.Copy(...
vielleicht so:
Delphi-Quellcode:
Bei mir funktioniert diese Variante unter allen Windows-Versionen einwandfrei. Mit copyfile(... hatte ich zuvor auch gelegentlich so einige "Probleme".
...
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; Ralf |
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! |
AW: CopyFile Datei wird nicht überschrieben
Zitat:
Delphi-Quellcode:
... ohne Probleme. Dann scheint das Problem wohl doch in deinem Code zu sein, gelle?
CopyFile
|
AW: CopyFile Datei wird nicht überschrieben
Zitat:
|
AW: CopyFile Datei wird nicht überschrieben
Zitat:
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 ;) |
AW: CopyFile Datei wird nicht überschrieben
Zitat:
Zitat:
Zitat:
|
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. |
AW: CopyFile Datei wird nicht überschrieben
Nein, wenn dort Yes ausgewählt wird, dann wird
Delphi-Quellcode:
zurückgeliefert und dann wird
mrYes
Delphi-Quellcode:
eben
FailIfExists := MessageDlg(...) <> mrYes;
Delphi-Quellcode:
.
false
|
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: |
AW: CopyFile Datei wird nicht überschrieben
Zitat:
|
AW: CopyFile Datei wird nicht überschrieben
Zitat:
Ich kann dir aber versichern, dass der Code, den ich gepostet habe, bis auf die Variablennamen soweit übereinstimmt und für diese Sache keinerlei weitere Codeabschnitte betrifft oder von ihnen betroffen wird. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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