Eigene Klasse um Verzeichnise im Ordner zu lesen
-
Hallo
Ich arbeite gerade daran mir eine Klasse zu schreiben, wo ich ein Laufwerk einlesen kann. Das einlesen klappt auch. Die Verzeichnisstructur möchte ich in einem CTreeCtrl-Steuerelemnet anzeigen lassen. Im Moment ist es so, wenn man auf das (+) vor dem Ordner Namen drückt, werden alle Dateien im Ordner angzeigt. Es soll aber so sein, das dann erst die Dateien ermittelt werden, wenn der Ordner expandiert wird. Es dauert sonst einfach zu lange z.B. das Laufwerk C zu durchsuchen.
Den Standarddialog kann ich nicht nutzen, da ich von bestimmten Dateien die erste Zeile einlesen will und diese gleich anzeigen möchte. Daher sollen die Dateien erst eingelesen werden, wenn ich den Ordner expandiere.
Ich kommt mein bisheriger Code dazu.oid CDateiWaehlen::Findverzeichnis(CString drive) { //Hier werden die Verzeichnise eines angegebenen Laufwerkes durchsucht. CTreeCtrl* tree = (CTreeCtrl*)GetDlgItem( IDC_VerzBaum); HTREEITEM pItem = tree->GetRootItem(); FindRecursivVerzeichnis(drive,pItem); } void CDateiWaehlen::FindRecursivVerzeichnis( CString path, HTREEITEM pNode) { CFileFind finder; path += "\\*.*"; BOOL bWorking = finder.FindFile( path ); while (bWorking) { bWorking = finder.FindNextFile(); if (finder.IsDots()) { //tue nichts } else { if ( finder.IsDirectory()) { TVINSERTSTRUCT tvInsert; tvInsert.hParent = pNode; tvInsert.hInsertAfter = pNode; tvInsert.item.mask = TVIF_TEXT; char sz[_MAX_PATH]; strcpy( sz, finder.GetFileName()); tvInsert.item.pszText = sz; CTreeCtrl* tree = (CTreeCtrl*)GetDlgItem( IDC_VerzBaum); HTREEITEM item = tree->InsertItem( &tvInsert); CString test= finder.GetFilePath(); FindRecursivVerzeichnis( test, item); } else { TVINSERTSTRUCT tvInsert; tvInsert.hParent = pNode; tvInsert.hInsertAfter = pNode; tvInsert.item.mask = TVIF_TEXT; char sz[_MAX_PATH]; strcpy( sz, (LPCTSTR) finder.GetFileName()); tvInsert.item.pszText = sz; CTreeCtrl* tree = (CTreeCtrl*)GetDlgItem( IDC_VerzBaum); tree->InsertItem( &tvInsert); char Path[_MAX_PATH]; strcpy(Path,(LPCTSTR)finder.GetFilePath()); //Dateilänge bestimmen und überprüfen , ob sie größer als 16 Byte ist DWORD Dateilaenge =finder.GetLength(); if (Dateilaenge >= 16) { //Dateiendung der Datei mit eingestellter Dateiendung vergleichen CString Endung = DateiEndung();//Eingestellt Dateiendung ermittlen CString istDateiEndung = GetExtension(finder.GetFileName()); istDateiEndung.MakeLower();//macht die Endung in kleine Buchstaben int resultDateiEndung = strcmp(Endung,istDateiEndung); int result = strcmp(Endung,"*"); if (resultDateiEndung == 0) { NameEinlesen( Path,finder.GetFileName()); } else { if (result == 0) NameEinlesen( Path,finder.GetFileName()); } } } } } finder.Close(); }
Drive lasse ich in einer Combobox wählen, wo alle verfügbaren Laufwerke aufgelistet sind.
Kann mir jemand einen Hinweis geben , was man ändern müßte.
Bin für Hinweise und Tipps dankbar.Cu
Oli[ Dieser Beitrag wurde am 12.12.2002 um 13:21 Uhr von Oli_1977 editiert. ]
[ Dieser Beitrag wurde am 12.12.2002 um 13:24 Uhr von Oli_1977 editiert. ]
-
Hier ein Beispiel: (Kannst auch eine Klasse von CTreeCtrl ableiten und das dann dort rein packen)
bool HasASubDir(LPCTSTR Path) { CFileFind ff; BOOL cont = ff.FindFile(CString(Path) + "\\*"); while(cont) { cont = ff.FindNextFile(); if(ff.IsDirectory() && !ff.IsDots()) return true; } return false; } void FindFolder(LPCTSTR Path,CTreeCtrl& list,HTREEITEM parent) { CFileFind ff; BOOL cont = ff.FindFile(CString(Path) + "*"); while(cont) { cont = ff.FindNextFile(); if(ff.IsDirectory() && !ff.IsDots()) { HTREEITEM hitem = list.InsertItem(ff.GetFileName(),parent,TVI_SORT); if(HasASubDir(ff.GetFilePath())) list.InsertItem("?",hitem); } } } CString GetPath(CTreeCtrl& tree,HTREEITEM hitem) { CString path; do { path = tree.GetItemText(hitem) + "\\" + path; hitem = tree.GetParentItem(hitem); } while(hitem); return path; } void CTreeDlg::OnOK() { FindFolder("C:\\",m_tree,m_tree.InsertItem("C:\\")); } void CTreeDlg::OnItemexpandingTree(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; HTREEITEM& hitem = pNMTreeView->itemNew.hItem; HTREEITEM hchild = m_tree.GetChildItem(hitem); if(m_tree.GetItemText(hchild) == "?") { m_tree.DeleteItem(hchild); FindFolder(GetPath(m_tree,hitem),m_tree,hitem); } *pResult = 0; } /E: Hatte OnItemexpandingTree vergessen
[ Dieser Beitrag wurde am 12.12.2002 um 16:24 Uhr von Nemesyzz editiert. ]
-
Hallo.
Danke, werde mir mal den Code reinziehen.
Cu
Oli