代码改变世界

小记——文件遍历

2014-01-16 21:19  jiaoluo  阅读(271)  评论(0编辑  收藏  举报
void Cdialog1Dlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码

	const char psDirName[] = "F:\\SQLyaog\\SQLyog Trial";
	TraveDir((char *)psDirName);

	//CDialogEx::OnOK();
}

#define MAXSIZE 100
void Cdialog1Dlg::TraveDir(char* psDirName)
{
	CFileFind FindFile;		//CFileFind类
	long hFile;
	char szDir[MAXSIZE];
	strcpy_s(szDir,MAXSIZE,psDirName);
	strcat_s(szDir,MAXSIZE,"\\*.*");
	hFile = FindFile.FindFile(_T(szDir));
	if(!hFile)//判断此文件夹目录下有没有文件或文件夹(目录)
	{
		AfxMessageBox("This directory is not exist file");
		return ;
	}
	else//如果有文件或文件夹(目录)
	{
		while(FindFile.FindNextFileA())//顺序遍历文件夹目录,找出当前目录下文件夹,用递归法查找所用目录及其子目录,以便检索
		{//IsDirectory判断此文件是否是文件夹(目录),IsDots判断此文件是否是"."当前目录".."上一层目录
		 //这一点很重要,不然程序会陷入死循环,在当前目录下循环,或遍历上一层目录再上一层目录。。。
			if(FindFile.IsDirectory() && !FindFile.IsDots())//important
			{
				char szDirSpaceNext[MAXSIZE];
				strcpy_s(szDirSpaceNext,MAXSIZE,psDirName);
				strcat_s(szDirSpaceNext,MAXSIZE,"\\");
				strcat_s(szDirSpaceNext,MAXSIZE,FindFile.GetFileName());//记录当前文件是目录时的文件路径,以便下面递归调用
				AfxMessageBox(szDirSpaceNext);
				TraveDir((char*) szDirSpaceNext);//递归调用,遍历子目录。
			}
		}
	}
	char szDirSpace[MAXSIZE];
	strcpy_s(szDirSpace,MAXSIZE,psDirName);
	strcat_s(szDirSpace,MAXSIZE,"\\*.exe");
	hFile = FindFile.FindFile(_T(szDirSpace));//搜索目录下的所有exe文件。
	while(hFile)//判断是否遍历完全到
	{
		hFile = FindFile.FindNextFileA();
		
		AfxMessageBox((LPCTSTR)FindFile.GetFileName());
		
	}
	/*
	错误警示;
	1.低级错误while(FindFile.FindNextFileA());原因是复制粘贴,粘贴了do while()中的while语句
	2.下面这样做所得答案总是少一个满足要求的值。
	if(hFile)//下面的没有去判断释放满足条件。
	{
		while(FindFile.FindNextFileA());//注意这里的分号。
		{
		
			AfxMessageBox((LPCTSTR)FindFile.GetFileName());

		}
		
	}
	*/
}

  还有这里忘记要Close了。