MFC实现代码:
void CMytest_2View::OnFilefind()
{
// TODO: Add your command handler code here
CString strFolderPath(_T(""));
TCHAR szPath[_MAX_PATH];
BROWSEINFO bi;
bi.hwndOwner=GetSafeHwnd();
bi.pidlRoot=NULL;
bi.lpszTitle=_T("选择文件夹");
bi.pszDisplayName=szPath;
bi.ulFlags=BIF_RETURNONLYFSDIRS;
bi.lpfn=NULL;
bi.lParam=NULL;
LPITEMIDLIST pItemIDList=SHBrowseForFolder(&bi);
//以上部分为显示一个对话框用于获得文件路径
if(pItemIDList)
{
if(SHGetPathFromIDList(pItemIDList,szPath))
{
strFolderPath=szPath;
MessageBox(_T(szPath));
//得到文件路径并以对话框显示
}
//下面注释代码为参考链接中的代码,我注释了他们
// 防止内存泄露,要使用IMalloc接口
/* IMalloc*pMalloc;
if( SHGetMalloc(&pMalloc) !=NOERROR )
{
TRACE(_T("无法取得外壳程序的IMalloc接口\n"));
}
pMalloc->Free(pItemIDList);
if(pMalloc)
pMalloc->Release();
*/
}
else
{
strFolderPath=_T(""); // 文件夹路径为空
MessageBox(_T("文件路径获取失败"));
}
ScanFile(strFolderPath);
//到此为止,这些代码仅仅完成了获取路径的功能,真正的功能在ScanFile中得到实现
}
//该函数添加方法:
//在class视图中的view类中右击选择add member functions。分别填入
//void 和ScanFile(CString strPath)
void CMytest_2View::ScanFile(CString strPath)//原代码的参数为引用类型。我觉得这尼玛递归很危险。
{
CFileFind find;CString strTemp=strPath;
CString strDirectory=strPath +_T("\\*.*");
CString strFile; MessageBox(_T(strDirectory));
vector<CString> m_vStrAllFiles;
// zm容器
BOOL IsFind=find.FindFile(strDirectory);
while(IsFind ){IsFind=find.FindNextFile();
//经过这个操作才是文件夹中第一个子文件(即"."文件)。
// 如果是"." 则不扫描。过滤掉"."和“..”两个不可见文件。关于这个“.”文件见MFC随手记之三。
if(find.IsDots())continue;
// 如果是是目录,继续扫描此目录
else if(find.IsDirectory())
{
strFile=find.GetFileName();strTemp=strPath+_T("\\") +strFile;
//我把源代码里的strTemp替换成strPath,这样才能递归。
ScanFile(strTemp);
}
// 文件
else
{
strFile=find.GetFileName();
// 此处也可以根据相应的扩展名来设置
//你可以选择进VECTOR.
m_vStrAllFiles.push_back(strFile);
//显示非文件夹文件
MessageBox(_T(strFile));
}
}
find.Close();
}
程序应用:
但文件夹的图片文件过于多的时候可以选择用它来计数!
参考资料:
http://bbs.youkuaiyun.com/topics/360170037?page=1(觉得源代码有几个问题,修改之后运行正确)
这里还一个非MFC实现的链接,不过我没看。先留着:
http://www.bobd.cn/itschool/Program/vc/200612/itschool_13397.html