Problem mit FindFirst und FindNext



  • Hallo,
    ich habe noch immer Probleme damit, alle Dateien und Unterordner eines vordefinierten Ordners anzeigen zu lassen.
    Hier ist erstmal der Quelltext:

    void __fastcall TForm1::SearchFiles(AnsiString Root)
    {
    	// Funktionsvariablen / Objekte
    	TStringList *Dirs=new TStringList();
    	TSearchRec f;
    	TSearchRec f1;
    	int FFRes;
    	AnsiString Verz;
    
    	// Richtige Formatierung des Suchverzeichnisses
    	if (Root[Root.Length()]=='\\')
    		Verz=Root+"*.*";
    	else
    		Verz=Root+"\\*.*";
    
    	FFRes=FindFirst(Verz,0x10,f);   // Verzeichnisse suchen
    	// Sollte Suche nach Ordner erfolgerich sein
    	if (FFRes==0) {
    		// Suche solange weiter bis Suchen nach einem Ordner nicht mehr erfolgreich ist
    		while (FFRes==0) {
    			if ((f.Attr&0x10)==0x10) {
    				;//Dir
    				if (f.Name[1]!='.')
    				Dirs->Add(f.Name);
    			}
    			FFRes=FindNext(f);
    		}
    		FindClose(f);
    	}
    
    	if (Root[Root.Length()]=='\\')
    	Verz= Root;
    	else
    	Verz=Root + "\\";
    
    	FFRes=FindFirst(Verz,faAnyFile ,f);   // Dateien suchen
    	// Sollte Suche nach Datei erfolgreich sein
    	if (FFRes==0) {
    		while (FFRes==0) {
    			if ((f.Attr&32)) {
    			;//File
    				if (Root[Root.Length()]=='\\')
    					LBoxFilesToZip->Items->Add(Root+f1.Name);
    				else
    					LBoxFilesToZip->Items->Add(Root+"\\"+f.Name);
    			}
    			FFRes=FindNext(f);
    		}
    		FindClose(f);
    	}
    
    	for (int i=0;i<Dirs->Count;i++) {
    		Update();
    		if (Root[Root.Length()]=='\\')
    			SearchFiles(Root+Dirs->Strings[i]);
    		else
    			SearchFiles(Root+"\\"+Dirs->Strings[i]);
    	}
    	delete Dirs;
    }
    

    Das Hauptproblem ist, dass erstmal garnichts in der ListBox angzeigt wird.
    Beim Durchsuchen nach einer Datei (faAnyFile mit Attr = 32) im unter Quelltextbereich, wird bei FindFirst eine 2 zurückgegeben da gleiche gillt für FindNext, wenn ich bei der ersten Abfrage mitteile, dass die 2 als Rückgabeparameter ok ist. Leider habe ich keine Ahnung, was die 2 oder sogar die 6 (es Variert beim zweiten Durchlauf) für eine Fehelerbedeutung hat.
    Kann mir da einer weiterhelfen?
    Ich möchte alle Dateien und die dazugehörigen Pfadangaben der Dateien anzeigen lassen. Als übergabewert (AnsiString) erhält die Funktion GetCurrentDir().
    Die Suche der Ordner scheint durchaus zu funktionieren.

    Bitte helft mir.



  • ErrorCode 2 bedeutet "File not found".



  • der Fehler dürfte in Zeile 33 bis 36 liegen, denn auch dort mußt du nach . suchen...

    ein weitere kleiner Fehler befindet sich hier:

    LBoxFilesToZip->Items->Add(Root+[b]f1[/b].Name);
    

    noch einen Tipp: schau dir mal die Funktion IncludeTrailingPathDelimiter bzw. IncludeTrailingBackslash an, dann brauchst du nicht ständig die Abfrage nach dem abschließenden Backslash



  • Wie Linnea sagt: es fehlt das Dateisuchmuster.

    In meinem Beispiel steht

    if (Root[Root.Length()]=='\\') 
        Verz=Root + Edit1->Text; 
      else 
        Verz=Root + "\\" + Edit1->Text;
    

    Edit1 ist ein Textfeld mit dem gewünschten Suchmuster!
    (*.* oder *.bmp oder...
    das MUSS natürlich angehängt werden, das Feld hatte ich ganz vergessen zu erwähnen.

    Gruss
    Frnk


Anmelden zum Antworten