Rekursive Funktion verlassen



  • Hi,

    ich verwende eine Rekursive Funktion um komplette Ordner mit allen Unterordner und Dateien zu kopieren. Dies dauert ja nach größe sehr lange und ich möchte in meiner Anwendung gerne eine Möglichkeit zum Abbruch anbieten.

    Wie kann ich dies am besten machen? Mit return die Funktion beenden wird ja nicht gehen.

    Jendrik



  • Hallo Jendrik,

    und warum soll das nicht möglich sein? Wie hast Du das Kopieren denn implementiert?

    Ich würde sowieso nur die zu kopierenden Dateien / Ordner in der rekursiven Funktion ermitteln (z.B. in eine TStringList). Diese Dateien würde ich dann in einer normalen Schleife abarbeiten.

    Ach ja, zum Abbrechen: Ich weiß nicht, wie den Kopiervorgang durchführst. Möglicherweise ist es notwendig den Kopiervorgang als solches in einen Thread auszulagern, damit die Anwendung während des Kopierens bedienbar bleibt.
    Aber dann brauchst Du nur noch ein globale Variable, die Du beim Click auf den Abbrechen-Button setzt und die Du in der Schleife oder beim Aufruf der rekursiven Funktion auf ihren prüfst.

    Grüße Joe_M.



  • Alternative: in der Schleife Application->ProcessMessages() aufrufen, dann werden die bis dahin angefallenen Ereignisse abgearbeitet.

    @zufaulzumeinloggen: ist es nicht einfacher sich einzuloggen, als jedes mal diesen Namen zu tippen? 😉



  • @dasd: Schlimmer ist, dass ich ein paar Wörter ausgelassen hab'. Und ich kann's nicht korrigieren... Das Einloggen ist so nervig, weil man die Maus dafür nehmen muß.



  • Joe_M. schrieb:

    Das Einloggen ist so nervig, weil man die Maus dafür nehmen muß.

    Kann man die Edits nicht auch per TAB erreichen? Naja, was solls... :p



  • Dasd schrieb:

    Kann man die Edits nicht auch per TAB erreichen? Naja, was solls... :p

    Ja kann man, sind aber leider 35 (in Worten: FÜNFUNDDREISSIG) Tabs nötig... 😮

    Dasd schrieb:

    Alternative: in der Schleife Application->ProcessMessages() aufrufen, dann werden die bis dahin angefallenen Ereignisse abgearbeitet.

    Das sehe ich eigentlich nicht als Alternative, sondern als notwendiges Bestandteil, solange er keine Threads benutzt. Aber Du hast recht, ich hätte darauf hinweisen müssen.



  • Hi,

    was ist denn das für eine idee, alles in ein array zu legen. stell dir vor du willst 80gb daten mit über 5 millionen dateien kopieren.

    das läuft rekursiv perfekt.

    hab jetzt in der rekursion nen flag drinnen welches bei bedarf return ausgibt.

    jendrik



  • Du sollst Die Dateinamen (inkl. relativem Pfad) in einer StringList speichern nicht die Daten. Oder ist es wieder nur ein Drauloskopiertool, dass nicht mal vorher prüft, ob der Platz reicht...



  • Hi,

    ich meine ja auch nicht die daten. nur ein array mit undendlich vielen einträgen wo 5 millionen einträge gerne mal benutzt werden, ist das auch nicht ne gute lösung.

    was ist an dem array denn besser?

    wozu gibst denn rekursion?

    jendrik



  • Jendrik Kol schrieb:

    wozu gibst denn rekursion?

    Rekursion ist schon richtig, nur eben nicht sofort kopieren, sobald du eine Datei findest, sondern erst einmal in einer Liste speichern. Und ich wage mal zu bezweifeln, dass deine 5M Dateien alle in einem Verzeichnis liegen. Je nach Verschachtelung kann auch das sehr speicheraufwendig werden.

    Und wie Joe_M bereits sagte, kannst du auf diese Weise erst einmal die Gesamtgröße ermitteln und feststellen, ob das Kopieren überhaupt möglich ist.



  • Auf was hast Du die Stackgröße eigentlich eingestellt?
    Mit der Standardstackeinstellung tritt bei knapp 65000 rekursiven Aufrufen ein Stacküberlauf auf...

    Es geht ja auch nicht darum keine Rekursion zu verwenden, nur würde ich eben nur die Namen in der rekursiven Funktion ermitteln. Das hat eben den Vorteil, dass Prüfungen durchgeführt werden können, bevor der eigentliche Kopiervorgang gestartet wird. Außerdem kannst Du dann eine recht genaue Restzeitanzeige machen.

    Kleine xxx-Bildchen Sammlung? Oder wie bekommst Du sonst 5000000 Dateien auf ein 80 GB Laufwerk?


Anmelden zum Antworten