在MFC错误中以递归方式列出所有文件?

时间:2017-02-11 13:53:24

标签: c++ mfc

我想列出我的所有文件和文件夹(包括子文件夹)并将其显示在我的列表框中,因此我考虑编写一个递归函数来显示它们。但是,如果我在选择文件夹中显示所有文件和文件夹,但代码可以正常工作,但它无法在子文件夹中扫描(它只显示第一个文件夹而不再显示)。请帮我知道错误是什么?

这是我的功能(我将它添加到我的Dialog类中)

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 个答案:

答案 0 :(得分: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();
}