2017-02-11 6 views
0

Я хочу перечислить все мои файлы и папки (включая подпапки) и показать их в своем списке, поэтому я думаю о написании рекурсивной функции для их отображения. Но код работает хорошо, если я показываю все файлы и папки в папке выбора, но он не может сканировать в подпапках (он показывает только первую папку и не более). Пожалуйста, помогите мне узнать, что такое ошибка?Список всех файлов рекурсивно функционирует в MFC-ошибке?

Это моя функция (я добавляю его в мой класс диалогового окна)

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"\\*.*"); 

     } 
    } 
} 

И потом, я называю его, когда нажатие кнопки браузера с кодом

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

Предлагаю вам научиться использовать отладчик. –

+4

Я не думаю, что вы должны добавлять '*. *' Как в вызов функции, так и в тело функции. –

+0

Спасибо, Нил Баттерворт, я решаю его с вашим комментарием. – HuynhAT

ответ

0

Вот правильный способ Список рекурсивностей файлов:

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(); 
}