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
