Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Vertzeichnisstructur auslesen und anzeigen

Oli_1977 / 15 Antworten / Baumansicht Nickles

Hallo.

Ich habe folgendes Problem. In meinem Programm kann man bis jetzt eine Dateiendung und ein Laufwerk wählen. Nun will ich im gewählten Laufwerk die Ordner anzeigen lassen. Wählt man einen angezeigten Ordner sollen die Unterordner oder alle Datei mit der gewünschten dateiendung angezeigt werden.

Die Verzeichnisstruktur soll in einem Element des Types CTreeCtrl angezeigt werden. Das einlesen des Laufwerkes mache ich mit der Finktion CFileFind::FileFind.

Hat irgend jemand damit schon Erfahrungen gesammeltund kann mit Tipps oder Ratschläge geben?

Bin für jeden Hinweis bbzw. Tip dankebar, ich weiß langsam nicht mehr weiter.

Cu Oli

bei Antwort benachrichtigen
thomas woelfer Oli_1977 „Vertzeichnisstructur auslesen und anzeigen“
Optionen

was gibts denn dabei fuer ein problem? am einfachsten geht das mit einer rekursiven funktion die ein verzeichnis das zu untersuchen ist als parameter erhaelt. diese funktion iteriert dann ueber alle eintrage in diesem verzeichnis. handelt es sich um '.' oder '..' wird der eintrag ignoriert. handelt es sich um ein verzeichnis ruft sich die funktion selbst auf. sind alle abgearbeitet, kehrt die funktion zurueck... nachdem das ganze in eine treeview soll musst du der funktion auch noch die parent node geben, unter der das gefundene verzeichnis eingetragen werden soll.

WM_HOPETHISHELPS

this posting contains no tpyos.
bei Antwort benachrichtigen
Oli_1977 thomas woelfer „was gibts denn dabei fuer ein problem? am einfachsten geht das mit einer...“
Optionen

Hallo.
Danke erstmal, das Du geantwortet hast.
Hast Du dafür vielleicht ein Beispiel, wo ich mir das ganze mal ansehen könnte. Wäre für mich eine große Hilfe.

Cu
Oli

bei Antwort benachrichtigen
thomas woelfer Oli_1977 „Hallo. Danke erstmal, das Du geantwortet hast. Hast Du dafür vielleicht ein...“
Optionen

nur mal so hingeschrieben und nicht gestestet: tut aber prinzipiell das was du willst:

void Start()
{
// root des trees ermitteln
TreeItem* pItem = TreeCtrl.GetRoot();
// suche starten
FindRecursive( "c:\\", pItem);
}

void FindRecursiv( char* pszDir, TreeItem* pNode)
{
CFileFind finder;
BOOL bWorking = finder.FindFile("*.*");
while (bWorking)
{
bWorking = finder.FindNextFile();
if( finder.IsDots()) { /* ignore */ }
else if( finder.rIsDirectory()
{
TreeItem item = new TreeItem(); // TODO: mit info fuellen
pNode->AddChild( item);
FindRecursive( finder.GetFilePath(), pNode)
}
else
{
TreeItem item = new TreeItem(); // TODO: mit info fuellen
pNode->AddChild( item);
}
}
}

WM_HOPETHISHELPS

this posting contains no tpyos.
bei Antwort benachrichtigen
Oli_1977 thomas woelfer „nur mal so hingeschrieben und nicht gestestet: tut aber prinzipiell das was du...“
Optionen

Danke. Werde ich gleich mal testen.

Auch wenn es nicht funktionieren sollte, habe ich jetrzt wenigstens einen Ansatz.

Cu
Oli

bei Antwort benachrichtigen
Oli_1977 thomas woelfer „nur mal so hingeschrieben und nicht gestestet: tut aber prinzipiell das was du...“
Optionen

Habe es jetzt probiert.
Kenne aber pNode nicht. Das wird mir auch als Fehler angegeben.

Find auch keinen richtigen Hinweis dazu in meiner Hilfe.

Cu
Oli

bei Antwort benachrichtigen
Oli_1977 thomas woelfer „nur mal so hingeschrieben und nicht gestestet: tut aber prinzipiell das was du...“
Optionen

Sorry , wenn ich nerve. Es ist aber wichtig.
Ich habe es jetzt soweit abgeändert.

void CDateiWaehlen::Findverzeichnis(char* drive)
{
//root des trees ermitteln
(1) HTREEITEM *pItem = m_Baumstruktur.GetRootItem();

//suche starten
FindRecursivVerzeichnis(drive,*pItem);
}

void CDateiWaehlen::FindRecursivVerzeichnis( char *pszDir, HTREEITEM pNode)
{

CFileFind finder;
bool bWorking = finder.FindFile("*.*");
while (bWorking)
{
bWorking = finder.FindNextFile();
if (finder.IsDots())
{
//tue nichts
}else
{
if ( finder.IsDirectory())
{
HTREEITEM *item = new HTREEITEM(); //Todo mit Info füllen
(2),(3) pNode->AddChild( item);
(4) FindRecursivVerzeichnis(*finder.GetFilePath(), pNode);

}else
{
HTREEITEM *item = new HTREEITEM(); //Todo mit Info füllen
(5)(6) pNode->AddChild( item);

}
}
}
}

Meine Fehler sind in kurzen Stichpunkten:
(1) struct _TREEITEM *' kann nicht in 'struct _TREEITEM ** ' konvertiert werden
(2) Verwendung des undefinierten Typs "_TREEITEM"
(3) Der linke Teil von '->AddChild' muss auf Klasse/Struktur/Union zeigen
(4)FindRecursivVerzeichnis' : Konvertierung des Parameters 1 von 'const char' in 'char *' nicht moeglich
(5)= (3)
(6) =(2)


Ich weiß es ist viel, aber ich sehe voll auf dem Schlauch.

Cu
Oli

bei Antwort benachrichtigen
thomas woelfer Oli_1977 „Sorry , wenn ich nerve. Es ist aber wichtig. Ich habe es jetzt soweit...“
Optionen

ok, hier ein komplettes beispiel:

void CtestDlg::Findverzeichnis()
{
CTreeCtrl* tree = (CTreeCtrl*)GetDlgItem( IDC_TREE1);
HTREEITEM pItem = tree->GetRootItem();
FindRecursivVerzeichnis("c:",pItem);
}

void CtestDlg::FindRecursivVerzeichnis( CString path, HTREEITEM pNode)
{
CFileFind finder;
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_TREE1);
HTREEITEM item = tree->InsertItem( &tvInsert);

FindRecursivVerzeichnis( finder.GetFilePath(), item);
}
else
{
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_TREE1);
tree->InsertItem( &tvInsert);
}
}
}

WM_HOPETHISHELPS

this posting contains no tpyos.
bei Antwort benachrichtigen
Oli_1977 thomas woelfer „ok, hier ein komplettes beispiel: void CtestDlg::Findverzeichnis CTreeCtrl tree...“
Optionen

Hallo.
Danke, für die kompletten Funktionen. Es werden keine Fehler mehr angezeigt. Nur wird jetzt mein Programm gleich komplett beendet.

Cu
Oli

bei Antwort benachrichtigen
Oli_1977 thomas woelfer „ok, hier ein komplettes beispiel: void CtestDlg::Findverzeichnis CTreeCtrl tree...“
Optionen

Hallo
Funktioniert jetzt. Kann man eigentlich ermitteln, wenn der benutzer einen Ordner anwählt. Ich kann zwar die aktuelle Position ermitteln, aber wie bekomme ich den Pfad bis dahin.

Cu
Oli

bei Antwort benachrichtigen
thomas woelfer Oli_1977 „Hallo Funktioniert jetzt. Kann man eigentlich ermitteln, wenn der benutzer einen...“
Optionen

der filefinder hat nicht nur eine methode um den namen zu ermitteln sondern auch eine die den kompletten pfad liefert.

WM_FYI

this posting contains no tpyos.
bei Antwort benachrichtigen
Oli_1977 thomas woelfer „der filefinder hat nicht nur eine methode um den namen zu ermitteln sondern auch...“
Optionen

Hallo.Ja ich weiß.

Heißt finder.GetFilePath().
Ich meinte es so, jetzt wird ja der Verzeichnisbaum des Laufwerkes eingelesen und angezeigt. Nun ist meine Aufgabe, einen Ordner anzuwählen im CTreeCtrl und in diesem Ordner die 1 Zeile aller *.txt Dateien auszulesen. Da hilft mir leider die finder.GetFilePath() nicht weiter. Das Problem liegt wohl eher hierin der Anwendung des CTreeCtrl - Elementes. Das Laufwerk ist mir ja bekannt. Nun müßte ich mir da irgendwie scheinbar selber den Path zusammen schneiden.

Habe gehofft, das CTreeCtrl schon eine Funktion dafür liefert.
Ich weiß jetzt nämlich nicht, wie ich die Übergeordneten Ordner bestimmen sollte.

Cu
Oli

bei Antwort benachrichtigen
thomas woelfer Oli_1977 „Hallo.Ja ich weiß. Heißt finder.GetFilePath . Ich meinte es so, jetzt wird ja...“
Optionen

hab grad nix zum nachsehen zur hand - aber die elemente die man einfuegt TVINSERTSTRUCT (oder so) haben auch ein member in dem man sich daten merken kann. (word wohl LPVOID sein, bin mir aber ohne nachsehen nicht sicher.) - alles was du tun musst ist ein bisschen speicher allozieren, den pfad da reinkopieren und dir dann den zeiger auf diesen speicher in diesem member merken. wird dann ein element angeklickt kannst du das einfach auslesen.

alternativ kannst du mit GetParent() (wie gesagt: habe nichts zu nachsehen) ermitteln welche node das parent ist und dir damit den pfad anhand des eingetragenen textes zusammenbauen. (das ist naturlich ein wenig aufwendiger zu implementieren, dafuer sparts speicher).

WM_HOPETHISHELPS

this posting contains no tpyos.
bei Antwort benachrichtigen
Oli_1977 thomas woelfer „achso“
Optionen

Hallo.
Kannst du mir noch den Programmschnippsel schicken, wie man sich merken kann.

Danke

Cu
Oli

bei Antwort benachrichtigen
Oli_1977 thomas woelfer „was gibts denn dabei fuer ein problem? am einfachsten geht das mit einer...“
Optionen

Habe ich vergessen mitzuteilen. Ich nutze Visual C++ 6.0 und meine Anwendung ist eine dialogfeldbasierende.

Cu
Oli

bei Antwort benachrichtigen
Oli_1977 Nachtrag zu: „Vertzeichnisstructur auslesen und anzeigen“
Optionen

Kann man zu diesem Thema irgendwo eine deutsche hilfe finden?

bei Antwort benachrichtigen