2017-02-11 1 views
0

Ich möchte alle meine Dateien und Ordner (einschließlich Unterordner) auflisten und sie in meine Listbox anzeigen, so dass ich über eine rekursive Funktion schreibe, um sie anzuzeigen. Aber der Code funktioniert gut, wenn ich alle Dateien und Ordner im Auswahlordner zeige, aber nicht in Unterordnern (es zeigt nur den ersten Ordner und nicht mehr). Bitte helfen Sie mir zu wissen, was der Fehler ist?Listet alle Dateien rekursiv in MFC-Fehler auf?

Dies ist meine Funktion

void CFileListingDlg::ListFile(CString path) 
{ 
    CFileFind hFile; 
    BOOL bFound; 
    CString filePath; 
    bFound=hFile.FindFile(path+L"\\*.*"); 
    while(bFound) 
    { 
     bFound=hFile.FindNextFile(); 
     if(!hFile.IsDots()) 
     { 
      m_lFiles.AddString(hFile.GetFilePath()); 

      //It work well with selecting folder if I remove this line 
      //But it shows only first folder when I use it 
      if(hFile.IsDirectory()) ListFile(hFile.GetFilePath()+L"\\*.*"); 

     } 
    } 
} 

Und dann, ich nenne es, wenn Klick Browser-Schaltfläche mit dem Code

void CFileListingDlg::OnBnClickedBtnBrowse() 
{ 
    // TODO: Add your control notification handler code here 
    // TODO: Add your control notification handler code here 
    CFolderPickerDialog folderDialog(_T("E:\\Test")); 
    if(folderDialog.DoModal()==IDOK) 
    { 
     m_eFolder.SetWindowText(folderDialog.GetPathName()); 
     m_lFiles.ResetContent(); 
     ListFile(folderDialog.GetPathName()); 
    } 
} 
+1

Ich schlage vor, Sie lernen, einen Debugger zu verwenden. –

+4

Ich glaube nicht, dass Sie das '*. *' Sowohl im Funktionsaufruf als auch im Funktionskörper anhängen sollten. –

+0

Danke, Neil Butterworth, ich löse es mit deinem Kommentar. – HuynhAT

Antwort

0

Hier ist der richtige Weg (ich es in meinem Dialog Klasse hinzufügen) zu Implementieren rekursive Dateien Auflistung:

void ListFiles(const CString& sPath, CStringArray& files) 
{ 
    CFileFind finder; 

    // build a string with wildcards 
    CString sWildcard(sPath); 
    sWildcard += _T("\\*.*"); 

    BOOL bWorking = finder.FindFile(sWildcard); 

    while (bWorking) 
    { 
     bWorking = finder.FindNextFile(); 

     // skip . and .. files; otherwise, we'd 
     // recur infinitely! 

     if (finder.IsDots()) 
     continue; 

     // if it's a directory, recursively traverse it 

     if (finder.IsDirectory()) 
     { 
     CString sFile = finder.GetFilePath(); 
     files.Add(sFile); 
     ListFiles(sFile, files); 
     } 
    } 

    finder.Close(); 
} 
Verwandte Themen