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