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.txtEs 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.txtwieso?
-
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!