当前位置:C++技术网 > 资讯 > CFileFind类的一个误区

CFileFind类的一个误区

更新时间:2015-12-24 17:16:47浏览次数:1+次

CFileFind是为另两类查找特殊服务器设计的MFC类的基类,CGopherFileFind在Gopher服务器上工作,CFtpFileFind在FTP服务器上工作,这些类为用户查找文件提供了一种无缝机制,与服务器协议、文件类型、地点、本地机器或远程服务器无关。

之前写了个文件重命名的程序,然后遇到点问题,那就是有漏掉的文件未查询到。经过一番调试,终于解决了问题。原来是没有将FindFile函数与FindNextFileA函数位置放好。实际上也是我没有将这两个函数理解好,因此在这里记录下来。

存储图片的文件夹:

先上代码:

CFileFind flFind;
	CString szDir;
	m_FileDir.GetWindowText(szDir);

	BOOL IsFind2=flFind.FindFile(szDir + "\\*.*");
	//统计位图数量
	int nBmpCount = 0;
	CFileFind flFindCount;
	BOOL IsFind=flFindCount.FindFile(szDir + "\\*.*");
	while (flFindCount.FindNextFileA())
	{
		//IsFind=flFindCount.FindNextFileA();
		if (!flFindCount.IsDirectory())
		{
			CString szPath;
			szPath = flFindCount.GetFilePath();
			MessageBox(szPath);
			char szLetter[128] = {0};	//盘符
			char szCurDir[128] = {0};	//目录
			char szName[128] = {0};		//文件名
			char szExt[128] = {0};		//扩展名
			_splitpath(szPath.GetBuffer(0), szLetter, szCurDir, szName, szExt);	//分解目录
			//判断文件扩展名
			if (strcmp(szExt, ".bmp") == 0)
			{
				nBmpCount++;
			}
		}
	}
刚开始的时候,我没有搞懂问题出在哪里。后来,我不断地断点调试,一直测一直测。最后发现是FindFile的问题。因此我加了一句MessageBox(szPath)调试代码,后来果真如我断点调试那样,漏了一个文件,就是因为
FindFile这里。在while语句之前的已经检查遍历了一个文件,然后,在while语句之后,就把这个之前遍历的那个文件漏掉了。看下运行结果:


修改代码:

CFileFind flFind;
	CString szDir;
	m_FileDir.GetWindowText(szDir);

	BOOL IsFind2=flFind.FindFile(szDir + "\\*.*");
	//统计位图数量
	int nBmpCount = 0;
	CFileFind flFindCount;
	BOOL IsFind=flFindCount.FindFile(szDir + "\\*.*");
	while (IsFind)
	{
		IsFind=flFindCount.FindNextFileA();
		if (!flFindCount.IsDirectory())
		{
			CString szPath;
			szPath = flFindCount.GetFilePath();
			MessageBox(szPath);
			char szLetter[128] = {0};	//盘符
			char szCurDir[128] = {0};	//目录
			char szName[128] = {0};		//文件名
			char szExt[128] = {0};		//扩展名
			_splitpath(szPath.GetBuffer(0), szLetter, szCurDir, szName, szExt);	//分解目录
			//判断文件扩展名
			if (strcmp(szExt, ".bmp") == 0)
			{
				nBmpCount++;
			}
		}
	}
运行结果你自己试试,看看能不能把之前的那个新建文件夹里的四个图片呢。