dateien nach dateiendung filtern



  • Servus Gemeinde!

    Das ganze sieht ja ganz gut aus, mir ist beim lesen des Threads aber folgende
    Frage in den Kopf gekommen. Wie geht man am besten vor, wenn es der umgekehrte
    Fall sein soll, wenn also bestimmte Extensions nicht aufgelistet werden sollen.
    Hat jemand schon was in dieser Richtung gemacht. Gut man könnte nach . suchen
    und bei jedem Fund überprüfen ob die vorliegende Endung gefiltert werden soll oder
    nicht. Gibt es noch einen anderen Ansatz?

    TinTin



  • komme nicht weiter... hat jemand noch ne idee ??

    gibt es sowas wie FileListBox inVB auch fuer MFC ?

    habe es nur bei VBA und Borland c++ gefunden. das wäre ja auch schon eine lösung.
    ansonsten weiss ich nicht wie ich mehrere auslesen kann.

    er nimmt immer wieder die erste datei.



  • An welcher Stelle in deiner oberen Schleife hast du denn die Abfrage eingebaut, ob du eine ".rbt" Datei hast?



  • CString Recurse(LPCTSTR pstr)
    {
    
      CFileFind finder;
    
       // build a string with wildcards
       CString strWildcard(pstr);
       strWildcard += _T("\\*.rbt");
    
       // start working for files
       BOOL bWorking = finder.FindFile(strWildcard);
    
       while (bWorking)
       {
          bWorking = finder.FindNextFile();
    
          // skip . and .. files; otherwise, we'd
          // recur infinitely!
    
          if (finder.IsDots())
             continue;
    
          // if it's a directory, recursively search it
    
          if (!finder.IsDirectory())
          {
             CString str_1;
    
             str_1 = finder.GetFileName();
    
             return str_1;
    
          }
        }
    
    }
    

    habe aus dem . einfach *.rbt gemacht



  • strWildcard += _T("\\*.rbt");
    

    wenn das dien Filter ist, dann findest du weder '.', noch '..', noch andere
    Verzeichnisse.

    Ich hab mal folgendes probiert:

    void Recurse(LPCTSTR pstr)
    {
    	CFileFind finder;
    
    	// build a string with wildcards
    	CString strWildcard(pstr),strFilter;
    	strWildcard += _T("\\*.*");
    	strFilter = _T(".txt");
    
    	// start working for files
    	BOOL bWorking = finder.FindFile(strWildcard);
    
    	cout << (LPCTSTR) pstr << endl;
    
    	while (bWorking)
    	{
    		bWorking = finder.FindNextFile();
    
    		// skip . and .. files; otherwise, we'd
    		// recur infinitely!
    
    		if (finder.IsDots())
    			continue;
    
    		// if it's a directory, recursively search it
    
    		if (finder.IsDirectory())
    		{
    			CString str = finder.GetFilePath();
    			Recurse(str);
    		}
    		else
    		{
    			CString str = finder.GetFilePath();
    			if (str.Find(strFilter) > 0) cout << (LPCTSTR) str << endl;
    		}
    	}
    	cout << _T("..") << endl;
    	finder.Close();
    }
    

    TinTin



  • Es sei noch angemerkt:
    - ".abc" ist per default gleichbedeutent mit ".abc*"
    - wenn Du was rekursiv machst, dann beachte bitte auch noch "FILE_ATTRIBUTE_REPARSE_POINT" prüfen, da Du sonst in eine Endlosschleife laufen kannst... (mittels MatchesMask)



  • also eigentlich ist es von mir auch beabsichtigt so das NUR *.rbt dateien in nur eben diesem einen ordner den ich an die funktion übergebe angezeigt werden.

    ich habe unter VBA schonma was von einer FilelistBox gehört bei der man einen Pfad angeben kann und dann irgendwie über filter halt auch auf der oberfläche nur die rbt dateien anzeigen lassen könnte. wäre das auch noch eine möglichkeit ? oder gibt es das bei mfc nicht ?

    danke



  • Du kannst im MFC eine eine CListBox mit .Dir() füllen. AFAIK kann man da auch
    per Wildcard einen Filter angeben.

    TinTin



  • also ich bin immernoch bei meiner listbox. allerdings will das nicht so ganz hinhauen. habe eine listbox erstellt. und auch über den klassenassistent einmal wert und control zugeweisen.

    aber irgendwie klappt das nicht so ganz. habe den code einfach unten angefügt. könnt ihr mal gucken was damit los ist ?

    CListBox m_ctl_fpga;
    
    m_ctl_fpga.SubclassDlgItem(IDC_fpga,this);
    
    m_ctl_fpga.Dir(0x0000,_T((LPCTSTR)"C:\\Dokumente und Einstellungen\\denrei\\Desktop\\bin-dateien\\*.rbt"));
    

    habe es in initial dialog drin

    Fehlermeldung ist:

    Es kommt immer das fenter mit "DEbug libary" also das gar nichts mehr geht. mit dem wiedreholen und ignorieren button.

    kann ich das mit dem code nicht einfach so machen ?



  • Der Code da oben ist vom Assistenten? 😮
    Irgendwie glaube ich dir das nicht... 🙄

    Steht diese Zeile auch in der OnInitDialog? Oder im Header?

    CListBox m_ctl_fpga;
    


  • nene der code ist der den in in initdlg eingefügt habe. also die 3 zeilen stehen da. aber irgendwie kommt immer diese fehlermeldung.

    ich weiss auch nicht wieso. sieht das denn auf den ersten blick erstmal richtig aus ?
    danke



  • Mach die ersten beiden Zeilen mal weg.
    Dann lege mit dem Assistenten eine Controlvariable an und versuchs nochmal. 🙂



  • oh man alles klar danke dir . habe grade nur die ersten beiden zeilen gelöscht und schon funtkioniert es. man ey so was und ich sitz da so lange dran.

    Danke dir !!



  • kurze und letzte frage hätte ich da noch.

    ich habe ja den pfad jetzt entgültig angegeben. der ist bei mir aber variable und wird in einen cstring gespeichert.

    wenn ich den pfad durch den string ersetze geht es irgendwie nicht und die listboc bleibt leer.
    woran kann das liegen ?

    danke



  • Zeig den Abschnitt mal.



  • m_ctl_fpga.Dir(0x0000,_T((LPCTSTR)"C:\\Dokumente und Einstellungen\\Heidenreich.KRAUSE_DE\\Desktop\\bin-dateien\\*.rbt"));
    

    ich habe es jetzt so versucht:

    m_ctl_fpga.Dir(0x0000,cFileDir);
    
    m_ctl_fpga.Dir(0x0000,_T((LPCTSTR)cFileDir));
    

    oder muss ich es anders mache ?

    danke !!



  • ok habe grad gesehen das ich die *.rbt am ende vergessen habe. aber er sollte doch trotzdem dann alles anzeigen was sich in dem ordner befindet oder?

    EDIT; hat sich erledigt. habe jetzt die dateiendung drangehangen. jetzt geht es wieder. besten dank !!!



  • Na ist doch schön. 🙂
    Fehler alleine finden ist doch viel besser als alles gezeigt kriegen, oder? 😉 👍



  • BTW:

    .Dir()
    

    kannst nicht benutzen um die Box rekursiv zu füllen. AfAIK musst
    du dir da was eigenes bauer.

    TinTin



  • wie meinste das jetzt ? also füllen geht doch . zumindest stehen da die dateinamen. ich bin jetzt nur dabei das ganze wieder auszulesen und das in einen string zu speichern. bin noch auf der suche nach dem passenden stück code.


Anmelden zum Antworten