dateien nach dateiendung filtern



  • hallo,

    ich will bestimmte dateien nach ihrer dateiendung filtern.
    zb habe ich einen ordner in dem viele verschiedene dateien sind. ich will aber nur alle *.exe dateien haben und die dateinamen in einen string schreiben.

    mit CFiledialog kann ich den Pfad ermitteln, das klappt soweit. nur die filterung der dateinamen. da weiss ich nicht wie man das am besten angehen sollte.

    danke euch !!



  • Guck mal in die FAQ, Kategorie Datei. 🙂
    Musste zwar noch anpassen, aber dank CString ist das kaum Arbeit. 😉



  • irgendwie bin ich zu blöd 😞

    FAQ --> C++ --> und da nen Thread mit Datei ??

    find ich nich. sorry.



  • Tip: Es gibt auch eine MFC-FAQ (ein Stück tiefer) 😉



  • Oder du nutzt die Klappliste über der Threadübersicht. 😉



  • also irgednwie hilft mir das nicht weiter.

    mein programm sieht soweit wie folgt aus:

    ich kann über einen durchsuchen button einen pfad auswählen. in diesem ordner sind diverse dateien aus denen die versionsnummer ausgelesen wird.

    es gibt jedoch eine bestimmte art von dateien (*.rbt dateien) die keine versionsnummer enthalten.

    ich möchte also erst die auswahl des ordner treffen. die vnummern werden ausgelesen. gleichzeitig sollen in aus dem gleichen ordner in einem listenfeld alle *.rbt dateien angezeigt werden.



  • 😞

    #include <afx.h>
    #include <iostream>
    
    using namespace std;
    
    void Recurse(LPCTSTR pstr)
    {
       CFileFind finder;
    
       // build a string with wildcards
       CString strWildcard(pstr);
       strWildcard += _T("\\*.*");
    
       // 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 = finder.GetFilePath();
             cout << (LPCTSTR) str << endl;
             Recurse(str);
          }
       }
    
       finder.Close();
    }
    
    void main()
    {
       if (!AfxWinInit(GetModuleHandle(NULL), NULL, GetCommandLine(), 0)
          cout << "panic!" << endl;
       else
          Recurse(_T("C:"));
    }
    

    das funktioniert bei mir vorn und hinten nicht 😞

    wenn ich zb cout durch MessageBox ersetze sagt er mir das messagebox ein nicht deklarierter bezeichner ist. das das else ohne dazugehöriges if das steht. etc. alles so komische fehler.

    gibt es noch einen anderen weg ? oder irgendwas wonach ich googeln könnte ? irgendein stichwort ??

    danke



  • Eventuell solltest du mal die geöffneten und geschlossenen Klammern zählen - beim if() in der main fehlt z.B. eine.



  • ja das hab ich ja alles schhon geändert, ist jetzt nur der originalauszug hier aus der FAQ. also klammer etc hab ich schon gesetzt semikolon hinzugeügt etc.

    gibt es evtl nochwas wonach man suchen kann ? mit diesem stück code komm ich absolut nicht klar... aber ich werde es weiter versuchen. wenn ich in 2std kein stück weitergekommen bin melde ich mich nochmal.



  • also kompilierungsfehler hab ich alles weg.

    void Recurse(LPCTSTR pstr)
    {
       CFileFind finder;
    
       // build a string with wildcards
       CString strWildcard(pstr);
       strWildcard += _T("\\*.*");
    
       // 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 = finder.GetFilePath();
             //cout << (LPCTSTR) str << endl;
    
             Recurse(str);
    
          }
        }
    
       finder.Close();
    
    }
    

    ich übergebe der funktion den dateipfad den ich mit dem openfiledialog rausbekomme.

    doch wo speichert er die dateinamen ?
    er guckt doch eig immer nur nach den pfaden obwohl ich doch nur einen ganz bestimmten durchsuchen lassen will.



  • Dann modifiziere das doch so, dass der nicht rekursiv arbeitet. 🙄

    if (!finder.IsDirectory())
          {
             CString str = finder.GetFilePath(); // Nun sollte der Dateiname in str stehen.
             //cout << (LPCTSTR) str << endl;
          }
    

    Ich habs nicht getestet, aber so ähnlich sollte es klappen.



  • Vodn7V schrieb:

    doch wo speichert er die dateinamen ?
    er guckt doch eig immer nur nach den pfaden obwohl ich doch nur einen ganz bestimmten durchsuchen lassen will.

    Der Dateiname der aktuell verarbeiteten Datei steht in deinem finder - du kannst ihn per GetFileTitle (reiner Name), GetFileName (Name+Erweiterung) bzw. GetFilePath (kompletter Dateipfad) auslesen und weiterverarbeiten:

    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 = finder.GetFilePath();
        //cout << (LPCTSTR) str << endl;
        Recurse(str);
      }
      else
      {
        CString name=finde.GetFileName();
        cout<<(LPCTSTR)name<<endl;
        //weiterarbeiten
      }
    }
    //finder.Close();//unnötig, da der Destruktor selber aufräumt
    


  • 👍 🙂

    es funktioniert !!!!! besten Dank *knutscha* 🙂

    EDIT : doch nicht so richtig. also er findet die datei schon. nur habe ich mehrere *.rbt dateien in einem ordner. wenn ich aber jetzt suchen lasse dann findet er immer nur die erste.

    bsp

    ich habe 1.rbt
    2.rbt
    3.rbt

    er findet bei jeden durchlauf immer nur 1.rbt.

    würde aber gerne alle finden.

    danke euch !!



  • 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


Anmelden zum Antworten