Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Wo ist hier der Fehler beim kopieren (https://www.delphipraxis.net/170476-wo-ist-hier-der-fehler-beim-kopieren.html)

Popov 19. Sep 2012 12:49


Wo ist hier der Fehler beim kopieren
 
Also das hier funktioniert nicht

Delphi-Quellcode:
  Result := Result and CopyFile(PChar(SourceFile), PChar(DestFile), True);
{}
das dagegen ja
Delphi-Quellcode:
  CopyFile(PChar(SourceFile), PChar(DestFile), True);
{}
Nur sehe ich den Fehler auf den ersten Blick nicht.

Der Sinn des ersten Codes ist, dass ich eine Menge von Dateien kopiere und wissen will ob alle kopiert wurden. Nach meiner Logik müßte es funktionieren.

Bei der Gelegenheit vielleicht noch eine Nebenfrage: in der OH steht, das wenn ich bei CopyFile False als dritten Parameter eingebe, die Datei einfach überschrieben wird. Nun steht da, dass bei True ein Fehler erzeugt wird. Nun verstehe ich nicht was mit Fehler gemeint ist. Ist damit der Rückgabewert gemeint? Haben Parameter True und False gleiche Rückgabewerte, verhalten sich nur anderes beim kopieren, oder sind auch die Rückgabewerte unterschiedlich. Oder was ist mit Fehler erzeugen gemeint?

Bernhard Geyer 19. Sep 2012 12:57

AW: Wo ist hier der Fehler beim kopieren
 
wenn result = False ist wird dein CopyFile nicht mehr durchgeführt.

Kan über den Compilerschalter "Boolsche Ausdrücke vollständig" erzwungen werden (Dürfte aber dann an vielen anderen Stellen krachen die sich auf die nicht vollständige Auswertung verlasse).

p80286 19. Sep 2012 12:57

AW: Wo ist hier der Fehler beim kopieren
 
1000

Ist result denn auch ein Boolean?
und was heißt "funktioniert nicht"? Auf den ersten Blick scheint da alles in Ordnung zu sein.

Gruß
K-H

P.S.
wenn result=false wird abgebrochen? wo ist da das If ?

DeddyH 19. Sep 2012 13:03

AW: Wo ist hier der Fehler beim kopieren
 
Es braucht kein If, da in der Standardeinstellung das Result ja bereits feststeht, bevor es zum CopyFile kommt. So sollte aber das Gewünschte erreicht werden:
Delphi-Quellcode:
Result := true;
...
if not CopyFile(PChar(SourceFile), PChar(DestFile), True) then
  Result := false;

himitsu 19. Sep 2012 13:13

AW: Wo ist hier der Fehler beim kopieren
 
Das mit dem Auswerten der boolischen Ausdrücke kann man auch partiell (zeilen-/befehlsweise) umstellen.

Aber dann schon eher so:
Delphi-Quellcode:
Result := CopyFile(PChar(SourceFile), PChar(DestFile), True) and Result;


Nja, warum es nicht geht: Frag mal deinen Debugger ... der weiß das.

Popov 19. Sep 2012 13:47

AW: Wo ist hier der Fehler beim kopieren
 
@Bernhard Geyer

Dass Delphi es nicht weiter verfolgt wenn das Ergebnis klar steht, weiß ich, nur bisher dachte ich, dass es nur für IF Abfragen gilt.

Trotzdem erscheint es mir unlogisch, denn dann klappt keine Opperation wie x := y and z, wenn y False ist.


@p80286

"funktioniert nicht" bedeutet, dass es nicht kopiert wird.


@DeddyH

if not CopyFile(PChar(SourceFile), PChar(DestFile), True) then Result := false;

ergibt aber nur das Resultat des einen Vorgangs. Hier will ich aber mehrere Vorgänge kombinieren


@himitsu

Result := CopyFile(PChar(SourceFile), PChar(DestFile), True) and Result;

klappt leider auch nicht.


Letztendlich kriege ichd as schon hin, nur wird es dann nicht so schön aussehen in einer Zeile.

DeddyH 19. Sep 2012 13:51

AW: Wo ist hier der Fehler beim kopieren
 
Sind die Zieldateien bereits vorhanden? In dem Fall wäre klar, wieso nicht kopiert wird. Allerdings bin ich nicht sicher, ob ich überhaupt verstanden habe, was Du erreichen willst.

TBx 19. Sep 2012 13:53

AW: Wo ist hier der Fehler beim kopieren
 
Wenn Dein Problem nur darin liegt, daß Delphi normalerweise keine Complete-Boolean-Evaluation macht, dann dreh es doch einfach um.

Statt:

Delphi-Quellcode:
  Result := Result and CopyFile(PChar(SourceFile), PChar(DestFile), True);
{}
verwende:
Delphi-Quellcode:
  Result := CopyFile(PChar(SourceFile), PChar(DestFile), True) and Result;
{}

Amateurprofi 19. Sep 2012 13:58

AW: Wo ist hier der Fehler beim kopieren
 
Zitat:

Zitat von Popov (Beitrag 1183567)
@Bernhard Geyer

Dass Delphi es nicht weiter verfolgt wenn das Ergebnis klar steht, weiß ich, nur bisher dachte ich, dass es nur für IF Abfragen gilt.

Trotzdem erscheint es mir unlogisch, denn dann klappt keine Opperation wie x := y and z, wenn y False ist.

Was erwartest du denn, welchen Wert x annimmt, wenn y false ist?
Wenn y false ist, kann dieses false durch ein nachgeschaltetes "and" nicht mehr verändert werden. Also wird die Verarbeitung hier abgebrochen und das false an x übergeben.
Was ist daran unlogisch?

himitsu 19. Sep 2012 14:24

AW: Wo ist hier der Fehler beim kopieren
 
Zitat:

Zitat von Popov (Beitrag 1183567)
@Trotzdem erscheint es mir unlogisch, denn dann klappt keine Opperation wie x := y and z, wenn y False ist.

Wieso?
Wenn Y False ist, dann kann Z sein was es will, bei AND kommt dann immer nur FALSE bei raus, also kann man da auch gleich aufhören und mu nicht weitergucken.
Dabei ist es natürlich egal, ob das Ergebnis dieser Auswertung als Parameter verwendet, an eine Variable zugewiesen oder in einem IF/CASE verwendet wird.

Und nein das wird natürlich bei sämtlichen booleanischen Auswertungen so gemacht.
Wäre ja sonst ein inkonsistentes Verhalten, wenn es nicht so wäre.

Popov 19. Sep 2012 14:30

AW: Wo ist hier der Fehler beim kopieren
 
Ok, dann langsam

CopyFile gibt als Rückgabewert ein TRUE wenn Kopiervorgang erfolgreich war, ein FALSE wenn nicht.

Gerade ist mir eine kleiner Gedankenfehler aufgefallen, so dass der Code in der Form für mich ein falsches Ergebnis liefert, was aber korrigiert werden kann und den Code nicht per se falsch macht. Mich interessiert es wenn mindestens ein FALSE vorkommt, der Code hier (und das ist der Fehler) aber erfast mindestens ein TRUE.

Ignorieren wir das aber mal kurz und gehen davon aus, dass ich mindestens einen erfolgreichen Kopiervorhang erfassen will.

Mit dem Code
Delphi-Quellcode:
Result := Result and CopyFile(...)
sollte ich einige Kopiervorgänge zusammenfassen könne. Wenn Result am Anfang FALSE ist und ein Vorgang TRUE, sollte Result nun TRUE sein. Bei der Schleife reicht also mindestens ein TRUE von CopyFile, damit Result immer TRUE enthält.

Unabhängig meines Gedankenfehlers scheint der Code dennoch nicht zu funktionieren, denn dazu müsste CopyFile ausgeführt werden und das macht es anscheinend nicht.

Denn egal ob im Zielverzeichnis Daten sind oder nicht, es wird nie kopiert.

himitsu 19. Sep 2012 14:33

AW: Wo ist hier der Fehler beim kopieren
 
Zitat:

Zitat von Popov (Beitrag 1183577)
Wenn Result am Anfang FALSE ist und ein Vorgang TRUE, sollte Result nun TRUE sein.

OR?

DeddyH 19. Sep 2012 14:34

AW: Wo ist hier der Fehler beim kopieren
 
Das und dann würde ich mal mit GetLastError ermitteln, wieso da nicht kopiert wird.

angos 19. Sep 2012 14:35

AW: Wo ist hier der Fehler beim kopieren
 
Hi,

dass er nicht kopiert, wenn Result vorab false ist, wurde ja bereits erklärt. Für deine Abfrage wäre vermutlich "or" die richtige Wahl, denn da muss er jeden Wert einzeln prüfen und entsprechend die hinterstehenden Funktionen (in deinem Fall CopyFile) ausführen.

Also
Delphi-Quellcode:
Result := Result or CopyFile(...)
Edit: Zu langsam

Popov 19. Sep 2012 14:40

AW: Wo ist hier der Fehler beim kopieren
 
Ok, vielen Dank für die Mühe und Entschuldigung für den Ärger, ich habe den Fehler. Es darf nicht AND, sondern muss OR sein. FALSE and TRUE ergibt ja FALSE. Da habe ich mir einen peinlichen Fehler geleistet.

EDIT:

Ich sehe gerade die anderen haben in der Zwischenzeit die gleiche Idee gehabt.

Popov 19. Sep 2012 14:55

AW: Wo ist hier der Fehler beim kopieren
 
Zitat:

Zitat von DeddyH (Beitrag 1183579)
Das und dann würde ich mal mit GetLastError ermitteln, wieso da nicht kopiert wird.

Vielen Dank, das ist wahrscheinlich die richtige Antwort auf meine Nebenfrage.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:17 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