Tree control und CFileFind



  • ich habe ein Tree Control und möchte darin die ordnerstruktur ab einem unterordner wiedergeben wobei jeder Ordner ein ("Root-Element") und jede datei ein ("Child-Element") darstellen soll.

    Ich weiss zwar wie man mit CFileFind umgeht aber bisher habe ich immer nur ein Verzeichnis wiedergegeben.

    Aber ich habe keinen Plan wie ich das jetzt Verschachteln muss?


  • Administrator

    Ich habe keine Ahnung wie man ein CTreeCtrl benutzt, aber wie du die Dateien und Unterodner und all das Zeugs bekommst ist relativ einfach.

    CFileFind FileFinder;
    CString strFind;
    BOOL BFind;
    CStringArray FolderArray;
    FolderArray.Add(_T("Irgendein Pfad zu einem Grundverzeichnis"));
    
    while(FolderArray.GetCount() > 0)
    {
        strFind = m_FolderArray.GetAt(0);
        strFind += _T("\\*.*");
        BFind = FileFinder.FindFile(strFind);
    
        while(BFind)
        {
            BFind = FileFinder.FindNextFile();
            if(FileFinder.IsDirectory())
            {
                if(!FileFinder.IsDots())
                {
                    FolderArray.Add(FileFinder.GetFilePath);
                    // Ordner sonst noch wo speicher für das CTreeCtrl;
                }
            }
            else
            {
                // Das File speichern für das CTreeCtrl;
            }
        }
    
        FolderArray.RemoveAt(0);
    }
    

    Hoffe das kann dir ein wenig weiterhelfen. Man kann das natürlich auch anderst lösen, denn so gibt es ein wenig ein Durcheinander, was das Suchergebnis betrifft.

    Grüssli



  • na beim CTreeCtrl hat man das problem das man sich merken muss wo man ist hoffe folgender Codeschnipsel zeigt das Problem

    HTREEITEM iroot= NULL, iroot2= NULL;
    
    iroot= m_cTreeIndex.InsertItem("Root 1");
           m_cTreeIndex.InsertItem("child 1.1", iroot);
    	iroot2=	m_cTreeIndex.InsertItem("Root 2", iroot);
    		m_cTreeIndex.InsertItem("child 2.1", iroot2);
    		m_cTreeIndex.InsertItem("child 2.2", iroot2);
    		m_cTreeIndex.InsertItem("child 2.3", iroot2);
           m_cTreeIndex.InsertItem("chield 1.2", iroot);
    

    Irgendwie muss man sich ja dann die ganze zeit merken wo man ist.


  • Administrator

    Wo ist da ein Problem?

    CTreeCtrl ctrlTree; // Das CTreeCtrl Objekt.
    CFileFind FileFinder; 
    CString strFind;
    HTREEITEM hTreeItem;
    BOOL BFind; 
    CStringArray FolderArray; 
    CArray<HTREEITEM, HTREEITEM> TreeItemArray;
    FolderArray.Add(_T("Irgendein Pfad zu einem Grundverzeichnis"));
    TreeItemArray.Add(ctrlTree.InsertAt(FolgerArray.GetAt(0)));
    
    while(FolderArray.GetCount() > 0) 
    { 
        strFind = m_FolderArray.GetAt(0); 
        strFind += _T("\\*.*"); 
        BFind = FileFinder.FindFile(strFind); 
    
        hTreeItem = TreeItemArray.GetAt(0);
    
        while(BFind) 
        { 
            BFind = FileFinder.FindNextFile(); 
            if(FileFinder.IsDirectory()) 
            { 
                if(!FileFinder.IsDots()) 
                { 
                    FolderArray.Add(FileFinder.GetFilePath()); 
                    TreeItemArray.Add(ctrlTree.InsertAt(FileFinder.GetFileTitle(), hTreeItem));
                } 
            } 
            else 
            { 
                ctrlTree.InsertAt(FileFinder.GetFileName(), hTreeItem);
            } 
        } 
    
        FolderArray.RemoveAt(0); 
        TreeItemArray.RemoveAt(0);
    }
    

    Der Code ist nicht getestet und ich habe nur die Angaben aus der MSDN und von dir, aber so in etwa sollte es doch gehen. Nicht?

    Grüssli


Anmelden zum Antworten