更新时间:2015-11-14 15:37:06浏览次数:1+次
在《垃圾文件清理源代码详解2》最后我放进了ResearchFile函数下面,我们解释下。
strcat_s(szTmp, "\\*.*");
在文件名之后添加"//*.*"声明为通配文件,使得能够遍历所有的文件和目录。
接着就是定义文件查找结构体WIN32_FIND_DATA。然后我们利用FindFirstFile,FindNextFile遍历盘符中的文件,FindFirstFile()函数
函数功能描述:查找指定目录的第一个文件或目录并返回它的句柄
函数原型 :
HANDLE FindFirstFile(
LPCTSTR lpFileName, // 目录名
LPWIN32_FIND_DATA lpFindFileData // 数据缓冲区
);
参数:BOOLFindNextFile(
HANDLE hFindFile, //searchhandle
LPWIN32_FIND_DATA lpFindFileData //databuffer
);
此函数用于遍历目录或文件时,判断当前目录下是否有下一个目录或文件if ((strcmp(findData.cFileName, "...") != 0) &&
(strcmp(findData.cFileName, "..") != 0) &&
(strcmp(findData.cFileName, ".") != 0))
在一个目录下面只操作目录下所有的文件和文件夹名称,
跳出对话框,如上图。
如图,会直接跳到断点的地方。现在我们需要查看变量的值,有两种方法:
1:
接着就会跳出局部变量窗口:
二:当你直接把鼠标放在代码上编译器会自己,跳出很多信息,这时候你就可以查看了。这个更方便。
这里我们看到没有cfilename这个值的信息。那么我们就用第二张方法。直接将鼠标放到这句代码上,然后点击就能看到这些信息:
下面我们接着运行:
我们测试出来了,有‘..'这个值。
findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY利用if语句判断,只有当我们查找的文件最后是以文件路径的形式显示出来的,才能最后进入到if语句中,而不是else语句。那么此时就需要判断该文件的后缀是不是我们所选中的文件后缀了,因此,我们需要一个函数来判断那就是IsTmpFile(),实现代码:
BOOL CClearTmpFileDlg::IsTmpFile(char *pszFileName)
{
for (POSITION pos = m_FilterList.GetHeadPosition(); pos != NULL;)
{
//获取临时文件
char *szFilter = m_FilterList.GetNext(pos);
int nChar = '.';
char* pszDes = strrchr(szFilter, nChar); //过滤掉“.”之前的“*”符号
pszDes += 1; //过滤掉.,使得pszDes指向扩展名
//获取参数pszFileName的扩展名
char* pszExt = strrchr(pszFileName, nChar); //过滤掉“.”之前的“*”符号
if (pszExt == NULL) //如果pszFileName没有扩展名
{
pszExt = pszFileName;
}
else
{
pszExt += 1; //过滤掉.,使得pszExt指向扩展名
}
//根据扩展名判断pszFileName是否是临时文件
if (_stricmp(pszExt, pszDes) == 0) //扩展名相等
{
return TRUE;
}
}
return FALSE;
}
在这里,我就只讲for (POSITION pos = m_FilterList.GetHeadPosition(); pos != NULL;)这句代码。我在《清理垃圾文件软件源代码解析2》就说了至于m_FilterList.AddTail(szText);我稍后会做解释,你现在不需要管。但是现在就要管了。一开始写代码我们需要在对话框类的头文件中声明定义一个变量:
相关资讯