Suche Datei auch in Unterordner



  • Hmm, das könnte ein Problem sein - das mußt du abfangen, indem du vor/in der isDirectory()-Überprüfung abbrichst, wenn die gefundene Datei "." (eigenes Verzeichnis) oder ".." (Vater-Verzeichnis) heißt:

    while (bWorking)
    {
      bWorking = search.FindNextFile();
    
      if (search.IsDirectory())
      {
        if(search.GetFileName()=="." || search.GetFileName=="..") continue;
        /*return*/ Find(search.GetFilePath(), strFiles);
      }
      else
         if(search.GetFileTitle()==strName) strFiles.Add(search.GetFilePath());
    }
    


  • Falls es jemanden interessiert: CFileFind::IsDots
    (Ist mir mal in dem Zusammenhang über den Weg gelaufen...)



  • estartu schrieb:

    Du musst die Verzeichnisse . und .. ignorieren!
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39130.html

    isabeau schrieb:

    Falls es jemanden interessiert: CFileFind::IsDots
    (Ist mir mal in dem Zusammenhang über den Weg gelaufen...)

    Vielen Dank, genau das wars. Mit

    if (search.IsDots()) 
        continue;
    

    vor der IsDirectory Abfrage funktionierts einwandfrei.

    Danke für die schnelle Hilfe! 👍



  • Eins wäre noch toll. Er sucht weiter, auch wenn er die Datei schon gefunden hat. Wäre nett wenn er abbrechen würde sobald er die Datei gefunden hat.



  • Ja, die jetzige Variante sucht nach allen Vorkommen der Datei auf deiner Platte und packt sie in dein StrinArray. Wenn du nur das erste Vorkommen finden willst, mußt du beim ersten Treffer mit der Suche abbbrechen (und bei jedem rekursiven Aufruf auswerten, ob auf diesem Weg etwas gefunden wurde).



  • Ist es definitiv nur EINE Datei? Dann mach doch ein return unter Zeile wo du den Dateinamen speicherst.

    Außerdem würde es dann reichen, einen CString zurückzugeben. 😉



  • estartu schrieb:

    Ist es definitiv nur EINE Datei? Dann mach doch ein return unter Zeile wo du den Dateinamen speicherst.

    Außerdem würde es dann reichen, einen CString zurückzugeben. 😉

    Ja, es kann nur eine Datei sein. Und diese existiert nur wenn man LabView installiert hat. Ich bekomme es mit dem Abbrechen der Suche nicht wirklich hin. Wenn ich es so mache:

    if(search.GetFileTitle() == strName)
    {
        strFiles.Add(search.GetFilePath());
    /*new*/    return strFiles;
    }
    

    wird nicht nach dem ersten Treffer beendet. 😕



  • Du mußt auch komplett alle rekursiven Aufrufe abbrechen, wenn von oben "gefunden" zurückkam, sonst wird im nächsten Ordner weitergesucht:

    BOOL Find(CString strDir, CString strName, CString &strFullPath)
    {
        CFileFind search;
        CString strWildcard
        strWildcard = (strDir + "\\*.*");
    
        BOOL bWorking = search.FindFile(strWildcard);
    
        while (bWorking)
        {
            bWorking = search.FindNExtFile();
    
            if(search.IsDots())continue;
            if (search.IsDirectory())
            {
                if(Find(Find(search.GetFilePath(),strName,strFullPath)) return TRUE;
            }
            else if(search.GetFileTitle()==strName)
            {
                strFullPath=GetFilePath());
                return TRUE;
            }
        }
        search.Close();
        return FALSE;
    }
    


  • Besteht die Möglichkeit, das die suche nach einer Datei nicht auf Groß und kleinschreibung achtet, sondern nur auf die Zeichen nach denen gesucht wird?



  • Dazu könntest du z.B. die beiden zu vergleichenden Dateinamen in CString-Variablen speichern und dann MakeUpper() oder MakeLower() ausführen. Dann erst die beiden Namen vergleichen.


Anmelden zum Antworten