Announcement

Collapse
No announcement yet.

Problem mit FindFirst/FindNext

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit FindFirst/FindNext

    Hallo Forum,

    ...und wieder mal das schon so oft angesprochene Thema mit der Dateisuche. Allerdings habe ich das noch nicht so recht durchschaut.<br>
    Ich möchte Verzeichnisse nach bestimmten Dateien zu durchsuchen (z.B. *.jpg). Gleichzeitig soll auch geprüft werden, ob sich noch Unterverzeichnisse im Verzeichnis befinden - in diesem Fall soll sich die Funktion rekursiv für das gefundene Unterverzeichnis aufrufen.<br><br>
    <i>Habe mir das so gedacht (und mir auch mal ein Struktogramm dazu gemalt):</i>
    An die Funktion werden StartVerzeichnis und Suchtext übergeben. Sie sucht dann das Verzeichnis nach allen Dateien (*.*) mittels FindFirst und FindNext ab. Wenn eine Datei gefunden wurde, soll durch Fallunterscheidung geprüft werden:<br>
    <i>1) ob der Suchtext im Dateinamen vorkommt bzw. die gesuchte Dateierweiterung,<br>
    2) es sich um ein Unterverzeichnis handelt oder<br>
    3) nichts dergleichen (Case Else)</i><br>
    Im Fall 1 soll wird der Eintrag (Pfad/Dateiname) im eine Liste eingetragen, im 2ten Fall wird die Funktion mit dem gefundenen Verzeichnisnamen nochmal aufgerufen, im 3ten Fall garnix<br><br>
    Soweit so gut, die Denkarbeit ist durch, das Struktogramm ist gemalt, aber wie implementiere ich die Funktion denn nun? Wenn ich so darüber nachdenke, fällt mir dann doch auf, dass ich mit der eigentlichen Programmierung garnicht sooooo gut zurechtkomme *schäm* ;-)<br><br>
    Wenn mir also irgendwer in dieser Hinsicht helfen könnte, dass wäre super! Kann auch auf Wunsch mal das Struktogramm zuschicken, ich glaube dass erklärt mein Vorhaben besser.<br><br>
    Vielen Dank erstmal, ich hoffe von Euch zu hören. Markus.

  • #2
    Tja, das hat einen Hacken:

    Wenn du nach *.jpg suchst werden auch nur diese Dateien/Directorys gesucht. Problem dabei ist, dass es für das Filesystem egal ist, ob es eine Datei oder Directory ist. Ein Suchlauf mit *.jpg kann somit nie Directorys finden (Ausnahme sie heißen tatsächlich .jpg).

    Aus diesem Grunde sin 2 Suchläufe zu starten:

    Einer der mit *.* alles durchsucht und die Directorys erfasst und ein zweiter, der dann die gefundenen Direchtorys nach *.jpg durchsucht.

    Die sollten ineinander geschachtelt werden.

    Wenn du es nicht selber machen willst:

    http://home.snafu.de/christian.marquardt/dlls.3/3_chfilesearch.htm
    Christian

    Comment


    • #3
      Hallo Christian,

      lieben Dank für die schnelle Antwort. Zu dem Link: den habe ich schon vorher im Forum gefunden. Leider kann ich mit einer dll ziemlich wenig anfangen, da ich die Funktion selbst schreiben möchte.<br>
      Ausserdem hast Du da wohl was falsch verstanden in meiner Beschreibung. Die Funktion SOLL ja alle Dateien suchen und dann per Fallunterscheidung auseinanderhalten. Erst bei der Unterscheidung wird dann geprüft, ob es sich um eine gesuchte Datei oder ein Unterverzeichnis handelt.<br><br>
      Das Auslesen aller Dateien im Verzeichnis funzt jetzt auch. Nur die Fallunterscheidung macht mir Probleme.<br>
      Der Dateiname steht ja als AnsiString im SearchRec - also kann ich den AnsiString auf den Suchtext hin prüfen bzw durchsuchen.<br><br>
      NEUES PROBLEM JETZT:<br>
      Wie kann ich eine gefundene Datei (gesucht mit Attribut faAnyFile) dahingehend abfragen, ob es sich um ein Verzeichnis handelt? Verzeichnisse gibt mir die Kiste bei faDirectory nicht aus! Oder kann es sein, dass es vielleicht an meinem OS (Win2k) bzw. NTFS liegt?<br><br>
      Ich glaube, ich sollte Dir mal mein Struktogramm schicken, dann wird Dir eher deutlich, wie ich den Funktionsablauf geplant habe - jedenfalls, wenn Du Dich mit Struktos nach Nassy-Shneiderman auskennst.<br><br>
      Für den Fall der Fälle hier mal meine Mail-Addy:<br>
      <a href="mailto:[email protected]">markus@mille1. d2g.com</a><br><br>
      Ansonsten kann ich mich nur nochmal für Deine Hilfe bedanken. Gruss, Markus

      Comment


      • #4
        Bitte, gern geschehen.

        if((fd.Attr&faDirectory)==0)

        Das sollte dir eigentlich sagen, ob es ein Directory ist, wobei fd der Zeiger auf die SearchRec ist
        Christian

        Comment


        • #5
          Hallo Christian,

          nochmal vielen Dank. Habe das Problem zwischenzeitlich gelöst bekommen. Deine Methode ist zwar in der Borland-Hilfe beschrieben, aber irgendwie funzt das nicht so recht.<br>
          Habe das nun gelöst, in dem ich das betreffende Verzeichnis mittels "DirectoryExists" abfrage, bevor ich es in die Liste aufnehme.<br>
          <b>WICHTIG!!!</b> Es muss auch geprüft werden, ob das Verzeichnis "." oder ".." heisst!!! Sonst wird beim rekursiven Aufruf das Parent-Verzeichnis wieder abgeprüft - und bei mehreren 10tausend gleichzeitigen Funktionsaufrufen hängt sich auch ein guter Rechner schonmal auf ;-)

          Naja, jedenfalls funzt das nun. Kann Dir den Quelltext ja mal zukommen lassen (wenn Interesse).

          Nun habe ich ein neues Problem mit dem TreeView. Das hab ich unter "Markierung bei TreeView entfernen" gepostet. Vielleicht schaust ja mal rein.

          Danke nochmal. Gruss, Markus

          Comment


          • #6
            ja, das mit den "." und ".." ist richtig. Das sind Verweise auf das aktuelle und das übergeordnete Verzeichnis.

            Dein Posting mit dem TreeView habe ich gesehen. Ich fürchte da gibt es keine Lösung um die Hintergrundfarbe zu ändern.

            Die große Lösung wäre natürlich, eine eigene Komponente von TCustomTreeView abzuleiten und die Ausgabe entsprechend anzupassen. Eventuell würde es reichen, bei TTreeNode (das ist der Knoten) das Ereignis WM_ERASEBKGRD mit einer eigenen Farbe zu versehen (glaube ich eigentlich nicht)

            Du kannst ja mal bei www.tmssoftware.com schauen, ob da ein TreeView ist, der die Änderung der Farbe zuläßt. Die Komponenten sind dort für den Privatgebrauch frei und laufen ohne Einschränkung.

            Ansonsten vielleicht mal google befragen.

            Christia
            Christian

            Comment


            • #7
              Hi Christian,

              auch für das TV-Problem(chen, was ja nur ein Schönheitsfehler war) habe ich zwischenzeitlich eine Lösung gefunden:<br><br>
              Wenn eine TreeNode geklickt (markiert) wird, erhält sie ja den Focus. Wenn das einem erstmal klar geworden ist ;-) dann setzt man einfach die TV-Eigenschaft "HideSelection" auf "true" und übergibt den Focus im MouseDown-Ereignis des TV an ein anderes Ojekt (bei mir eine GroupBox). Fertig ist. Nun schaut schwarze Schrift auf grauem Hintergrund mit Hottrack->true einfach nur noch genial aus... wie in HTML mit Hover-Effekt.

              .... nur mal für den Fall, dass Du das vielleicht mal verwenden willst.

              Gruss, Markus

              Comment


              • #8
                Jo
                Christian

                Comment

                Working...
                X