findfirst, findnext



  • Falsche Schleife!!!

    do
    {
    //Verarbeizung;
    }
    while(Bedingung);

    Hat auch Sunday schon gepostet. LESEN musst Du die Tips schon; 🕶

    Meiner war ernstgemeint! 😃

    [ Dieser Beitrag wurde am 06.03.2003 um 19:57 Uhr von DerAltenburger editiert. ]



  • ok, folgender Code scheint jetzt etwas besser zu gehen, zumindest kommen die doppelten gefundenen Dateien nicht mehr so angezeigt werden, aber manchmal passiert das:

    Message: C:\Eigene Dateien\test.txt
    Message: C:\Eigene Dateien\xyz.txt
    Message: C:\Eigene Dateien\test.txt

    Es kommen also auch doppelte Einträge, nur nicht direkt hintereinander 😞 😞 😞

    TSearchRec dirinfo;
        for( int i = 0; i < extCount; i++ )
        {
            if( FindFirst( aDir + "\\" + extList->Strings[ i ], faAnyFile, dirinfo ) == 0 )
                do
                {
                    StatusBar->Panels->Items[ 0 ]->Text = AnsiString( dirinfo.Name );
                    AnsiString tmp = AnsiString( aDir + "\\" + dirinfo.Name );
                    MessageDlg( tmp, mtConfirmation, TMsgDlgButtons( ) << mbOK, 0 );
                    //findStringInFile( tmp );
                    //Application->ProcessMessages( );
                }
                while( FindNext( dirinfo ) == 0 && SuchStop == 0 );
            FindClose( dirinfo );
        }
    


  • so sollte es zum beispiel gehen:

    //---------------------------------------------------------------------------
    void __fastcall TForm1::SuchAusgabe(AnsiString FileName, AnsiString Directory)
    {
      StatusBar->Panels->Items[0]->Text = FileName;
      Application->ProcessMessages();
    
      Application->MessageBox(AnsiString(Directory + "\\" + FileName).c_str(),
                              "Hinweis", MB_OK + MB_ICONINFORMATION);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      for (int i = 0; i < extCount; i++)
      {
        TSearchRec dirinfo;
    
        // suche beginnen -> erstes element anzeigen
        if (!FindFirst(aDir + "\\" + extList->Strings[i], faAnyFile, dirinfo))
          SuchAusgabe(dirinfo.Name, aDir);
    
        // nächste treffer ausgeben
        while(!FindNext(dirinfo))
        {
          SuchAusgabe(dirinfo.Name, aDir);
    
          // wenn gesetzt, schleife abbrechen
          if (SuchStop) break;
        }
    
        FindClose(dirinfo);
    
        // diese schleife auch abbrechen
        if (SuchStop) break;
      }
    }
    //---------------------------------------------------------------------------
    

    [ Dieser Beitrag wurde am 06.03.2003 um 22:28 Uhr von Sunday editiert. ]



  • Problem: Es werden in der MessageBox auch die Ordner ohne Dateinamen angegeben.

    Also es werden sowohl "C:\Eigene Dateien" als auch zum Beispiel "C:\Eigene Dateien\datei.txr" ausgegeben. Ich will aber NUR dateien haben.



  • So, nu aber schläunigst in die Hilfe und mal nachlesen was findfirst/findnext so alles bietet. Inklusive der Parameter!

    -junix



  • Sunday, bei deinem Code passiert auch folgendes:

    Message: C:\Eigene Dateien\test.txt
    Message: C:\Eigene Dateien\xyz.txt
    Message: C:\Eigene Dateien\test.txt

    wieso?



  • Weil du noch nicht die Attribute der gefundenen Einträge prüfst.



  • Doch, faAnyFile ist es doch, also jede Datei.

    ABER ICH HABE DEN FEHLER GEFUNDEN:

    Und zwar wird jeder Ordner zweimal durchlaufen.

    Wenn ich also C:\Eigene Dateien angebe, dann werden die Dateien INNERHALB des angegebenen Suchpfads immer nur einmal (richtig!) angezeigt, bei allen anderen Ordnern und damit Unterordnern dann aber zweimal ==> KONSEQUENZ: Der Fehler liegt daran, dass in Sundays und meinem "Ex-Code" alle Unterordner zweimal durchlaufen werden. Ich kann aber nicht erkennen wo :(( : ( 😞



  • Dann solltest du Debuggen...

    -junix



  • Nur Dateien bekommst Du mit ...

    if( FindFirst( Dir + "*.txt", faAnyFile & ~faDirectory, dirinfo ) == 0 )
    


  • Frage:

    Ruft ihr die Findxxx- Funktionen in einer rekursiven Programmstruktur auf? 😕

    Das vertragen die Funktionen nicht!!! (???)(Macht Ärger bei BCB 4.0)
    - Dabei wird SearchRec- Information gestört!!! - Das koennte das Fehlverhalten erklaeren!?

    Für Rekursive Suche besser:

    - Dateinamen + Unterordner in je eigene Stringliste lesen
    - Suchschleife abschliessen
    - Fuer alle (gespeicherten) Ordnernamen Rekursion rufen!

    Bei Rekursion innerhalb der Suchschleife wird Info gestoert: Nach Rueckkehr aus Rekursion ist Searchrec falsch belegt! 😮


Anmelden zum Antworten