Announcement

Collapse
No announcement yet.

Dateien suchen

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

  • Dateien suchen

    HI Leute! Ich habe mich mal im WWW auf die suche nach einem Source gemacht um Dateien zu suchen, und auch was gefunden. Kann mir vielleicht jemand sagen, wieso dieser Source nicht funktioniert?
    Wäre echt nett!!

    Tobias
    <br>
    <b> void __fastcall FindAllFiles(TStringList *FileList,
    String sSearchRoot, String sMask) <b>
    <br>
    {
    <br>
    TStringList *Dirs = NULL; //the subfolders of this folder
    <br>
    int Counter;
    <br>
    String Tempry;
    <br>
    TSearchRec Found;
    <br>
    try
    {//outer catch
    <br>
    try
    <br>
    {//finally wrapper around Dirs
    <br>
    Dirs = new TStringList;
    <br>
    Dirs->Sorted = true;
    <br>
    Dirs->Duplicates = dupIgnore;
    <br>
    //now search this folder
    <br>
    Tempry = sSearchRoot + sMask;
    <br>
    try
    <br>
    {//finally wrapper around found
    <br>
    if(FindFirst(Tempry, faAnyFile, Found) == 0)
    <br>
    {
    <br>
    CheckAndAdd(sSearchRoot, Dirs,
    FileList, sMask, Found);
    <br>
    while(FindNext(Found) == 0)
    <br>
    {
    <br>
    CheckAndAdd(sSearchRoot, Dirs,

    FileList, sMask, Found);
    <br>
    }//end while
    <br>
    } //end if
    <br>
    }//end wrapper Found, try
    <br>
    __finally
    <br>
    {
    <br>
    FindClose(Found);
    <br>
    }//end wrapper Found, finally
    <br>
    //Now search each subfolder within this
    <br>
    Counter = Dirs->Count;
    <br>
    for(int x = 0; x < Counter; x++)
    <br>
    {
    <br>
    FindAllFiles(FIleList, Dirs->Strings[x], sMask);
    <br>
    }
    <br>
    }//end wrapper Dirs, try
    <br>
    __finally
    <br>
    {
    <br>
    if(Dirs)
    <br>
    delete Dirs;
    <br>
    }//end wrapper Dirs, finally
    <br>
    }//end outer try
    <br>
    catch(Exception &E)
    {
    <br>
    throw;
    <br>
    }//end outer catch
    <br>
    }
    <br>
    <b>void __fastcall CheckAndAdd(String sSearchRoot, TStringList *sDirs,

    TStringList *sFileList, String sMask,

    TSearchRec &sFound)<b>
    <br>
    {
    <br>
    try
    <br>
    {
    <br>
    if((sFound.Name[1] != '.') && (sFound.Attr & faDirectory) > 0))
    <br>
    sDirs->Add(sSearchRoot + sFound.Name); //it's a folder
    <br>
    else //is it a file matching our mask
    <br>
    {
    <br>
    if(MatchesMask(sFound.Name, sMask)
    <br>
    FileList->Add(sSearchRoot + Found.Name);
    <br>
    }
    <br>
    }
    <br>
    catch(Exception &E)
    <br>
    {
    <br>
    throw;
    <br>
    }
    <br>
    }

  • #2
    Hallo Tobias, ich hab mir den Quelltext mal in ein Projekt eingebaut und versucht zu compilieren. Zuerst wurde die Funktion CheckAndAdd angemeckert. Wenn kein Prototyp deklariert wird, muß die Funktion vor dem ersten Aufruf stehen. Also CheckAndAdd nicht hinter, sondern vor FindAllFiles. Dann meckert der Compiler in der Zeile

    if((sFound.Name[1] != '.') && (sFound.Attr & faDirectory) > 0))

    Wenn man die letzte Klammer entfernt, kommt er auch damit klar. Ich kann mir aber eher vorstellen, daß hinter dem && eine öffnende Klammer fehlt. Nun bleibt der Compiler bei MatchesMask hängen. Diese Funktion ist nicht bekannt, und damit meine Hilfe am Ende. Was funktioniert bei Dir nicht ? Hast Du die gleichen Fehlermeldungen oder andere Probleme ? Gruß - Günthe
    Günther

    Comment


    • #3
      HI!!
      Danke für deine schnelle Hilfe! Ja, ich habe die gleichen Fehlermeldungen. Es wundert mich ein bisschen, das dort so viele Fehler drin sind, denn ich habe den Source von einer Borland Seite geladen. Wenn der Code überhaupt nicht funktionieren will, kennst du eine bessere Möglichkeit meine gemsamte Festplatte nach Dateien zu durchsuchen??
      Danke im Vorraus!

      Tobia

      Comment


      • #4
        Hallo Tobias, Wenn Du das ans Laufen bringen willst, mußt Du Dir die Funktion MatchesMask beschaffen oder versuchen, nachzubauen. Die Funktion muß sFound.Name und sMask auswerten und TRUE oder FALSE zurückliefern. Das ganze Programm beruht auf den Funktionen FindFirst und FindNext. Such mal hier im Forum und in der BCB-Hilfe danach, da gibt es eine Menge. Und irgendwo hat Andreas Kosch auch mal einen Hinweis gegeben, wie man es noch eleganter machen kann... Gruß - Günthe
        Günther

        Comment


        • #5
          OH man!

          Hätte ich mir bloss die Seite noch einmal genau durchgelesen, ja ja ENGLISCH, ts ts ts.
          Also, ich habe das jetzt zum laufen gekriegt aber wenn ich FindAllFiles aufrufe, dann kommt eine EAccesViolation, kann das mit NT zusammenhängen?

          Gruß:

          Tobia

          Comment


          • #6
            Hallo Tobias,

            ich krieg's auch nicht so richtig ans Laufen :-(. Eine Zugriffsverletzung hatte ich beim ersten Startversuch, aber da hatte sich der Builder wohl irgendwie verschluckt. Danach hat er mir dann nur ein Verzeichnis durchsucht, der rekursive Selbstaufruf klappt bei mir nicht.

            MatchesMask ist übrigens eine Funktion aus der Unit Masks, steht in der Hilfe. Auf meiner Festplatte finde ich nur die Headerdatei MFC\AFX.H mit einem Prototypen für ein MatchesMask, aber das ist was anderes.

            Hast Du schon das Forum durchsucht ? War was brauchbares dabei ? Was willst Du eigentlich mit dieser Funktion erreichen ? Alle Dateien auflisten, oder eine bestimmte Datei suchen ?

            Gruß - Günthe
            Günther

            Comment


            • #7
              HI!
              Ich will damit eigentlich die gesamte Festplatte zum Beispiel nach allen *.doc Dateien durchsuchen. Bei mir läuft das Prog jetzt. Allerdings durchsucht es nur ein Verzeichnis. Ich habe das Forum noch nicht durchsucht. Find ich komisch, ich denke das soll die gesamte Platte durchsuchen, stand zumindest auf der Seite wo ich das her hab.

              Tobia

              Comment


              • #8
                Hallo Tobias,

                mach Dir ein Formular mit zwei ListBoxen. Eine für die *.DOC Dateien, eine für die Verzeichnisse. In der Funktion CheckAndAdd schreib statt sDirs->Add ListBox1->Items->Add und statt FileList->Add ListBox2->Items->Add. Die Abfrage if(MatchesMask(... schmeiß raus. Alle Funktionen legst Du innerhalb des TForm1 Objektes. Die Parameter TStringList schmeiß raus. Ruf einmal die Funktion FindAllFiles mit SearchRoot "c:\\" auf. Dann machst Du eine Schleife, in der Du eine Zeile aus ListBox1 ausliest und dann löscht. Mit dem ausgelesenen Text rufst Du FindAllFiles auf. Wenn ListBox1 leer ist, bist Du fertig. In FindAllFiles muß noch die Schleife

                for(int x = 0; x < Counter; x++)
                {
                FindAllFiles(FIleList, Dirs->Strings[x], sMask);
                }

                gelöscht werden. Dann sollte es funktionieren...

                Gruß - Günthe
                Günther

                Comment


                • #9
                  Hallo schon wieder!

                  Wieso kann ich aus CheckAndAdd keine Steuerelemente ansprechen (TMemo, etc)? Was muss ich ändern?

                  Gruß:

                  Tobia

                  Comment


                  • #10
                    Hab ich doch gesagt: Du mußt ein Form1::CheckAndAdd daraus machen
                    Günther

                    Comment

                    Working...
                    X