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


Anmelden zum Antworten