CFileFind Suche stoppen/beenden ???
-
Hallo,
wie kann man die CFileFind Funktion (beim Suchen) beenden (?), sodass die Suche gestoppt ist !
Danke
:: NoName ::
-
Servus,
wie meinst du das? Willst du die Methode FindFile() oder FindNextFile() von CFindFile stoppen oder wie, wo, wer, was? *BAHNHOF*
CFileFind ffIniFile; BOOL bFileFound = ffIniFile.FindFile("*.ini"); while (bFileFound) { bFileFound = ffIniFile.FindNextFile(); m_ctrCombo.AddString(ffIniFile.GetFileName()); }Wenn er nichts mehr findet dann hört er auf. m_ctrCombo ist eine Member von einem Combobox Ctrl. (Typ: CComboBox)
Der Quelltext sucht nur nach *.ini Dateien und listet diese in einer Combobox auf.
*winke*
Hellsgore
-
Naja Hellsgore, ich habe eine rekursive Suche die nach Dateien sucht ! Und wenn die Datei schon gefunden wurde, dass Prog aber immernoch weitersucht, dann soll man die Suche mit einem "Stop-Button" beenden können ! So wie bei der Windose-Suche
! Die Suche kann beliebig gestoppt werden !Hoffe du verstehst mein prob !
Danke
:: NoName ::
-
öhm,
ich wills mal so sagen:
CGehirn *pWnd = new CGehirn(); pWnd = (CGehirn*)GetNoNameData(); if (pWnd->GetDünnpfiff() > -1) { TRACE("Ajo, Gerallt!!!"); } else { TRACE("Wer ist tot? NageldieKatzandieWand"); }Output schrieb:
Wer ist tot? NageldieKatzandieWand

Ne, du musst doch dann irgendwo ein Abbruchkriterium haben oder? Zeigst du uns a bissl' QuellCödchen?
*winke*
Hellsgore
-
Damit man deinen Stopbutton drücken kann,muss das Suchen in einen eigenen Thread laufen.
void CDeinDialg::OnStartButton() { UpdateData(); Filename_Edit.EnableWindow(false); suche_anhalten = false; AfxBeginThread(SuchDatei,this,THREAD_PRIORITY_NORMAL); } void CDeinDialog::OnStopButton() { suche_anhalten = true; } UINT SuchDatei(LPVOID pParam) { CDeinDialog * meinDailog = (CDeinDialog *) pParam; CFileFind ffIniFile; BOOL bFileFound = ffIniFile.FindFile(meinDialog->FileName_String); while (bFileFound) { if(meinDialog->suche_anhalten) { break; } bFileFound = ffIniFile.FindNextFile(); meinDialog->m_ctrCombo.AddString(ffIniFile.GetFileName()); } meinDialog->FileName_Edit.EnableWindow(true); fIniFile.Close(); return 0; }
-
Ein Abbruchkriterium ???

Hmm, das einzigste was ich benutze ist am Ende finder.Close() ! Aber damit kann man nicht viel anfangen ... Hier mein Code :
CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LIST1); CFileFind finder; BOOL bResult = finder.FindFile(Pfad + "*.*"); while(bResult) { bResult = finder.FindNextFile(); m_Pfad = finder.GetFilePath(); UpdateData(false); if(! finder.IsDots()) { if(finder.GetFileTitle().Find(m_DateiName) != -1) { if(! finder.IsHidden()) { pList->InsertItem(0, finder.GetFileName()); pList->SetItemText(0,1, finder.GetFilePath()); CTime m_ctime; CFileStatus status; if( CFile::GetStatus( finder.GetFilePath(), status ) ) { pList->SetItemText(0,2, status.m_ctime.Format("%d.%m.%y - %H:%M:%S")); } } else { UpdateData(); if(m_VDS == TRUE) { pList->InsertItem(0, finder.GetFileName()); pList->SetItemText(0,1, finder.GetFilePath()); CTime m_ctime; CFileStatus status; if( CFile::GetStatus( finder.GetFilePath(), status ) ) { pList->SetItemText(0,2, status.m_ctime.Format("%d.%m.%y - %H:%M:%S")); } } } } if(finder.IsDirectory()) { Search(finder.GetFilePath() + "\\*.*"); } } } ASSERT(GetSafeHwnd() != NULL); MSG msg; while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (!IsDialogMessage(&msg)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } } finder.Close();Danke und Gruß
:: NoName ::
-
@ Andorxor
Das habe ich mir auch gedacht, dann könnte ich ja mit WM_THREADFINISHED die Suche anhalten ! Aber das geht net, weil dann meine rekursive Suche nicht mehr funktionieren würde !
Beispiel:
Um die rekursive Suche zu starten muss ich ja das schreiben :
z.B. RekursiveSearch(finder.GetFilePath() + "\\*.*");wenn ich aber jetzt ein Arbeitsthread verwende, dann lautet es so:
AfxBeginThread(RekursiveSearch, ..., THREAD_PRIORITY_NORMAL);Das bedeutet ich kann finder.GetFilePath() + "\*.*" nicht aufrufen, und wenn ich es nicht aufrufen kann, dann kann ich auch nicht rekursiv suchen !
"Korrigier mich wenn ich mich Irre"

Trotzdem Danke
:: NoName ::
-
Das kannst du so lösen:
class threadinfo { public: CDialog * dia; CString Pfad; } void CDeinDialg::OnStartButton() { UpdateData(); Filename_Edit.EnableWindow(false); suche_anhalten = false; threadinfo * ti = new threadinfo(); ti.dia = this; ti.Pfad = FileName_String AfxBeginThread(SuchDatei,ti,THREAD_PRIORITY_NORMAL); } UINT SuchDatei(LPVOID pParam) { threadinfo * ti = (threadinfo *) pParam; CDeinDialog * meinDailog = (CDeinDialog *) ti->dia; CFileFind ffIniFile; BOOL bFileFound = ffIniFile.FindFile(ti->Pfad); while (bFileFound) { if(meinDialog->suche_anhalten) { break; } bFileFound = ffIniFile.FindNextFile(); meinDialog->m_ctrCombo.AddString(ffIniFile.GetFileName()); if(ffIniFile.IsDirectory()) { threahinfo ti2 = new threadinfo(); ti2->dia = ti->dia; ti2->Pfad = ffIniFile.GetFilePath() + "\\*.*"; SuchDatei(ti2); } } meinDialog->FileName_Edit.EnableWindow(true); fIniFile.Close(); delete ti; return 0; }
-
aha, super Idee ! Danke