Ordnersuche



  • Hi ich suche mit folgendem Code nach Verzeichnissen:

    int CERAZER_V2Dlg::ladefiles(CString m_Verz1)
    {
    
    CString curdir = m_Verz1;
        CString appname;
    	CString ftpfilename;
        CString winfilename;
    	CString strDatei = (m_dMsgDlg.omg + "*");
    	CFileFind DateiSuchen;
    
        CFileFind ftpFind;
    
            BOOL bContinue = ftpFind.FindFile(curdir + "\\*");
    
    		while(bContinue > 0)
    {
        bContinue = ftpFind.FindNextFile();
    
    	//strDatei = ftpFind.GetFileName();
        appname = ftpFind.GetFileName();
    
        if (appname == "." || appname == "..")
        {
    
    	}
        else
        {
    
    		if (ftpFind.IsDirectory())
            {
                m_Verz1 = curdir + "\\" + appname;
    
    			m_ctlListBox1.InsertString(0,(LPCSTR) ftpFind.GetFilePath()); 
    
    			ladefiles(m_Verz1);
            }
            else
            {
    
    			// In appname steht der Filename
                     // Mit ftpFind.GetFilePath());  bekommt man den Pfad und den Filenamen
    
            }
        }
    
    }
    
    return 1; 
    
    }
    

    Irgendwie kriege ich es nicht hin den Code so umzuschreiben das er mir NUR die gesuchten Ordner(=strDatei) ausgibt. Er gibt mir immer alle Ordner in "m_Verz1" an.
    Kann mir einer helfen ?



  • Wenn du nur die Dateinamen ausgegeben haben willst, steht der InsertString()-Aufruf im falschen Zweig:

    BOOL bContinue = ftpFind.FindFile(curdir + "\\*");
    while(bContinue > 0)
    {
        bContinue = ftpFind.FindNextFile();
        appname = ftpFind.GetFileName();
    
        if (appname == "." || appname == "..") //hier geht auch 'if(ftpFind.IsDots())
        {}
        else if (ftpFind.IsDirectory())
        {
            //Verzeichnis gefunden -> rekursive Suche
            //m_ctlListBox1.InsertString(0,ftpFind.GetFilePath()); 
            ladefiles(ftpFind.GetFilePath());
        }
        else
        {
            //Datei gefunden -> ausgeben
            m_ctlListBox1.InsertString(0,ftpFind.GetFilePath()); 
        }
    }
    


  • danke für die Antowrt, aber wenn ichs so hinschreibe wie du ( hab ich auch schon getestet), dann bekomme ich alle Files angezeigt, also nicht die Ordner.
    Aber ich will ja die Ordner, aber halt nur die mit dem bestimmten Namen(=strDatei bei mir).



  • Dann mußt du halt vergleichen, ob der Ordnername übereinstimmt (exakte Treffer kannst du mit einem if(ftpFiles.GetFileName()==strDatei) herausfiltern - für Wildecard-Treffer mußt du etwas mehr Aufwand betreiben).



  • hmmm also wenn ichs so hinschreib

    if (ftpFind.IsDirectory() && ftpFind.GetFileName()==strDatei)
            {
                m_Verz1 = curdir + "\\" + appname;
    
    			//if(ftpFind.GetFileName()==strDatei)
    			//{
                m_ctlListBox1.InsertString(0,(LPCSTR)ftpFind.GetFilePath());
    			//} 
    
                ladefiles(m_Verz1);
            }
            else
            {
    
                // In appname steht der Filename
                     // Mit ftpFind.GetFilePath());  bekommt man den Pfad und den Filenamen
    
            }
    

    findet er nix mehr

    so auch nicht :

    if (ftpFind.IsDirectory())
            {
                m_Verz1 = curdir + "\\" + appname;
    
    			if(ftpFind.GetFileName()==strDatei)
    			{
                m_ctlListBox1.InsertString(0,(LPCSTR)ftpFind.GetFilePath());
    			} 
    
                ladefiles(m_Verz1);
            }
            else
            {
    
                // In appname steht der Filename
                     // Mit ftpFind.GetFilePath());  bekommt man den Pfad und den Filenamen
    
            }
    

    Dabei wäre es doch so logisch.
    Wenn der bekommene Pfadname == strDatei -> Ausgabe
    Versteh ich nicht, wenn ich die if-Schleife um die Ausgabe weglasse gibt er mir alle Dateipfade aus...



  • Vermutlich stört für den Vergleich, daß du an den zu suchenden Dateinamen noch das "" angehängt hast (der kommt in den gefundenen Dateinamen mit Sicherheit nicht vor - und Wildcard-Vergleiche ala "Der Dateiname passt zum Muster "test"" sind leider etwas komplizierter).



  • Naja ich müsste halt noch ein paar Filter einbauen nehm ich mal an.

    Ich habs jetzt immerhin schon mal so

    if (appname == "." || appname == "..")    // Wenn appname ein File ist wird es rausgefiltert
        {
    
        }
    
    	else if (ftpFind.IsDirectory())
            {
                m_Verz1 = curdir + "\\" + appname;
    
    			if(DateiSuchen.FindFile(strDatei))
    			{
    
    			  m_ctlListBox1.InsertString(0,(LPCSTR) ftpFind.GetFilePath());
    			 }
    
                ladefiles(m_Verz1);
            }
            else
            {
    			//m_ctlListBox1.InsertString(0,(LPCSTR) ftpFind.GetFilePath());
    
                // In appname steht der Filename
                     // Mit ftpFind.GetFilePath());  bekommt man den Pfad und den Filenamen
    
            }
    

    Da zeigt mir zwar die Ordner an die ich suche, allerdings sind noch ein paar Ordner dabei die da nix zu suchen haben, aber immerhin kleiner Fortschritt 🙂



  • Du hast den Namen des tatsächlich gefundenen Ordners (alleinstehend in GetFileName() oder als kompletter Pfad in GetFilePath() - den mußt du jetzt mit deinem Wunschnamen vergleichen:

    CString strDatei = m_dMsgDlg.omg;//ohne "*"
    ...
        //Variante 1 - exakte Übereinstimmung mit Name
        else if (ftpFind.IsDirectory())
        {
            if(ftpFind.GetFileName()==strDatei)
            {
                m_ctlListBox1.InsertString(0,(LPCSTR) ftpFind.GetFilePath());
            }
            ladefiles(ftpFind.GetFilePath());
        }
    
        //Variante 2 - Zielname beginnt mit Vorgabename
        else if (ftpFind.IsDirectory())
        {
            CString strTarget = ftpFind.GetFileName();
            if(strTarget.Left(strDatei.GetLength()==strDatei)
            {
                m_ctlListBox1.InsertString(0,(LPCSTR) ftpFind.GetFilePath());
            }
            ladefiles(ftpFind.GetFilePath());
        }
    
        //Variante 3 - Zielname enthält Vorgabename
        else if (ftpFind.IsDirectory())
        {
            CString strTarget = ftpFind.GetFileName();
            if(strTarget.Find(strDatei)!=-1)
            {
                m_ctlListBox1.InsertString(0,(LPCSTR) ftpFind.GetFilePath());
            }
            ladefiles(ftpFind.GetFilePath());
        }
    

    (Um nach einem beliebigen Wildcard-Muster zu suchen, müsstest du etwas mehr Aufwand betreiben - läuft im Endeffekt auf Regular Expressions hinaus)



  • vielen vielen Dank ich werd mal gucken was ich davon brauchen kann 🙂



  • Also egal wie ichs mache, aber mit dem asterisk(*) hat das prog tatsächlich ein Problem, geb ich den Suchordner mit genauem Namen ein und lass den * Weg findet er es mir ohne Probleme, auch in Unter-unter-unterordnern.
    Aber wehe ich geb den * hinter den Suchbegriff...dann findet er zwar auch alle Ordner , aber noch jede Menge Unterordner die er nicht finden dürfte 😞



  • Dein letzter Code is echt super, ausser mit Gross und Kleinschreibung hat der eigentlich keine Probleme. Nochmals vielen Dank 👍

    Du musst mir mal bei Gelegenheit verraten was es mit Regular Expressions auf sich hat 🙂


Anmelden zum Antworten