MFC_VS清理器
VS清理器
界面
工程目录
列表控件ID改名IDC_FILELIST 绑定变量m_FileList
属性设置Accept Files 设置True

成员添加
// 用于保存待遍历的目录
vector<CString> m_DirVec;
// 保存待删除的文件
vector<CString> m_WaitVec;
// 保存可删除的文件个数
DWORD m_DelCount = ;
// 保存所有文件的个数
DWORD m_FileCount = ;
// 用于保存总文件的大小
ULONGLONG m_CountSize = ;
// 用于保存可删除的大小
ULONGLONG m_DelSize = ;
WM_DROPFILES响应拖拽控件信息
// 响应文件的拖拽消息
void CVSClearDlg::OnDropFiles(HDROP hDropInfo)
{
// 1. 获取到拖拽的所有文件和文件夹的的个数
int count = DragQueryFile(hDropInfo, -, nullptr, );
// 2. 通过获取到的文件个数进行循环获取文件名
for (int i = ; i < count; ++i)
{
// 2.1 申请空间用于保存文件的名称
WCHAR FileName[MAX_PATH] = { };
// 2.2 根据循环获取的下标获取文件的名称
DragQueryFile(hDropInfo, i, FileName, MAX_PATH);
// 2.3 判断当前的项是不是一个目录
if (GetFileAttributes(FileName) & FILE_ATTRIBUTE_DIRECTORY)
{
// 2.4 查看路径是否已经存在与容器中
if (m_DirVec.end() == find(m_DirVec.begin(), m_DirVec.end(), FileName))
{
// 2.5 添加到目录容器中,用于将来遍历
m_DirVec.push_back(FileName);
// 2.6 添加到列表中,用于进行显示
m_FileList.InsertItem(i, FileName);
}
}
}
CDialogEx::OnDropFiles(hDropInfo);
}
待删文件
按钮处理事件
// 这个按键用于获取所有可以删除的文件放置到待删除列表中
void CVSClearDlg::OnBnClickedButton3()
{
// 检查是否需有需要遍历的目录
if (m_FileList.GetItemCount() == )
{
MessageBox(L"没有更多可遍历的目录!");
return;
}
// 遍历路径容器,调用函数删除所有符合的文件
for (auto& Path : m_DirVec)
{
// 寻找需要删除的文件
FindFile(Path);
}
// 当前遍历了多少文件和可以删除多少
CString Msg;
Msg.Format(L"共有文件 %d 个,大小为 %.2lf MB\n可以删除 %d 个,大小为 %.2lf MB",
m_FileCount, m_CountSize / 1024.0 / 1024.0,
m_DelCount, m_DelSize / 1024.0 / 1024.0);
MessageBox(Msg);
}
// 遍历文件, 寻找需要删除的文件
VOID CVSClearDlg::FindFile(CString FilePath)
{
// 0. 定义需要的结构体
WIN32_FIND_DATA FindInfo = { };
// 1. 拼接需要寻找的字符串路径
HANDLE FindHandle = FindFirstFile(FilePath + L"\\*", &FindInfo);
// 2. 判断句柄是否获取成功
if (FindHandle != INVALID_HANDLE_VALUE)
{
// 3. 使用 do while 不断的获取所有的内容
do {
// 4. 如果是目录就继续遍历
if (FindInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
// 4.1 过滤掉 . 和 .. 路径
if (CString(".") == FindInfo.cFileName || CString("..") == FindInfo.cFileName)
continue;
// 4.2 拼接出新的路径,继续递归遍历
FindFile(FilePath + L"\\" + FindInfo.cFileName);
}
// 5. 处理文件类型的项
else
{
// 文件的总数 +1,大小也增加
m_FileCount++;
m_CountSize += FindInfo.nFileSizeLow;
// 5.1 否则判断是否是需要删除的文件
if (- != m_FileExt.Find(PathFindExtension(FindInfo.cFileName)))
{
// 要删除的文件个数 + 1
m_DelCount++;
m_DelSize += FindInfo.nFileSizeLow;
// 拼接出全路径
CString FileName = FilePath + L"\\" + FindInfo.cFileName;
// 5.2 将符合条件的文件单独添加到容器中
m_WaitVec.push_back(FileName);
// 5.3 将文件路径添加到列表中
m_WaitList.InsertItem(, FileName);
}
}
} while (FindNextFile(FindHandle, &FindInfo));
}
}
删除按钮处理事件
// 删除遍历到的符合要求的文件
void CVSClearDlg::OnBnClickedButton1()
{
// 检查是否需要删除文件
if (m_WaitList.GetItemCount() == )
{
MessageBox(L"没有更多可删除的文件!");
return;
}
int FileCount = ;
// 遍历文件进行删除
for (auto& FilePath : m_WaitVec)
{
if (DeleteFile(FilePath))
{
// 递增文件和大小
FileCount++;
// 删除成功,添加到列表
m_DelList.InsertItem(, FilePath);
}
}
// 可以删除的个数和实际删除的个数
CString Msg;
Msg.Format(L"可删除文件 %d 个\n实际删除删除文件 %d 个", m_DelCount, FileCount);
MessageBox(Msg);
}
后缀名的更新按钮事件
// 更新可删除的文件后缀名
void CVSClearDlg::OnBnClickedButton2()
{
// 从控件获取信息到变量
UpdateData(TRUE);
}
知识点
后缀名的类型设置直接在构造函数中初始化了信息
CVSClearDlg::CVSClearDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_VSCLEAR_DIALOG, pParent)
{
m_FileExt = _T(".obj\\.tlog\\.lastbuildstate\\.idb\\.pdb\\.pch\\.res\\.ilk\\.exe\\.sdf\\.ipch\\.log\\.db\\.suo\\");
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
WM_DROPFILES响应拖拽控件信息
类向导-选择想要响应的类-命令-WM_DROFILES
解除管理员模式下的消息过滤
ChangeWindowMessageFilterEx(m_hWnd, WM_DROPFILES, MSGFLT_ALLOW, NULL);
ChangeWindowMessageFilterEx(m_hWnd, 0x0049, MSGFLT_ALLOW, NULL);
根据循环获取的下标获取文件的名称
DragQueryFile(hDropInfo, i, FileName, MAX_PATH);
判断当前的项是不是一个目录
if (GetFileAttributes(FileName) & FILE_ATTRIBUTE_DIRECTORY)
遍历路径容器,调用函数删除所有符合的文件
for (auto& Path : m_DirVec)
{
// 寻找需要删除的文件
FindFile(Path);
}
CString里Format的用法
CString Msg;
Msg.Format(L"共有文件 %d 个,大小为 %.2lf MB\n可以删除 %d 个,大小为 %.2lf MB",
m_FileCount, m_CountSize / 1024.0 / 1024.0,
m_DelCount, m_DelSize / 1024.0 / 1024.0);
MessageBox(Msg);
拼接需要寻找的字符串路径
// 0. 定义需要的结构体
WIN32_FIND_DATA FindInfo = { 0 };
HANDLE FindHandle = FindFirstFile(FilePath + L"\\*", &FindInfo);
#####
PathFindExtension()查找后缀名函数
//否则判断是否是需要删除的文件
if (-1 != m_FileExt.Find(PathFindExtension(FindInfo.cFileName)))
MFC_VS清理器的更多相关文章
- RAM清理器
或许有些氨基小白不知道RAM是什么,官方的解释是"运行内存" 只要你的RAM够大,你玩什么都不卡! 今天给大家带来的就是 <RAM清理器>!!体积小,能量大就是我给他介 ...
- Python_练习_VS清理器
#导入os import os #创建列表放入后缀 d=[ '.txt','obj','tlog','lastbuildstate','idb','pdb','pch','res','ilk','sd ...
- 著名清理软件(CCleaner) 5.24.5841 中文版
软件名称: 著名清理软件(CCleaner) 软件语言: 多国语言 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 5.7MB 图片预览: 软件简介: CCleaner的体积小, ...
- CCleaner(著名清理软件) 5.21.5700 中文免费版(著名清理软件) 5.21.5700 中文免费版
软件名称: CCleaner(著名清理软件) 5.21.5700 中文免费版著名清理软件(CCleaner)软件语言: 多国语言授权方式: 免费软件运行环境: Win 32位/64位软件大小: 5.6 ...
- Chapter5_初始化与清理_用构造器初始化
接下来进入第五章,java中初始化和清理的问题,这是两个涉及安全的重要命题.初始化的功能主要是为库中的构件(或者说类中的域)初始化一些值,清理的功能主要是清除程序中不再被需要的元素,防止资源过分被垃圾 ...
- Spark源码剖析 - SparkContext的初始化(八)_初始化管理器BlockManager
8.初始化管理器BlockManager 无论是Spark的初始化阶段还是任务提交.执行阶段,始终离不开存储体系.Spark为了避免Hadoop读写磁盘的I/O操作成为性能瓶颈,优先将配置信息.计算结 ...
- 给 Linux 系统“减肥”,系统垃圾清理_系统安装与配置管理_Linux Today - Google Chrome
给 Linux 系统"减肥",系统垃圾清理 2013/10/16 linux 系统安装与配置管理 评论 15,555 Linux 计算机安装后,在我们不断的使用过程中,因 ...
- CCleaner 垃圾文件清理规则 编写指南
以下内容的英文版本来源于 CCleaner 官方论坛,仅供参考.欢迎大家编写并分享针对常用国产软件的垃圾文件清理规则!需要说明的是规则文件(Winapp2.ini)需和程序文件放于同一文件夹下,才能被 ...
- Windows 开发之VC++垃圾清理程序软件
概述 本程序软件的主要实现垃圾文件清理的功能,即对指定的文件格式的临时文件或垃圾文件进行遍历.扫描.显示.删除清理等功能.在程序界面设计方面,对默认对话框重新自定义绘制,主要包括标题栏的重绘.对话框边 ...
随机推荐
- window下安装多个tomcat
解压该压缩包,生成3分tomcat 分别命名为 tomcat1,tomcat2,tomcat3 进入tomcat1/conf/目录,修改server.xml 进入tomcat1/bin目录,修改 se ...
- eclipse中jsp页面乱码问题
若上述位置均改为utf-8之后,页面展示扔为乱码,检查jsp页面是否有编码说明
- 【Selenium】idea导入eclisp项目的问题
①导入:file→new→Project from exiting 选择ecliesp 然后next就可以 ②添加依赖:每个包都要加,引用其他包的类,也要添加依赖 setting选择junit4
- java代码实现JDBC连接MySql以及引用驱动程序包
JDBC链接MySql JDBC链接MySql的话题已经老掉牙了,这次我只想通过使用简洁的代码实现,采用封装的思想,将链接MySql的代码封装在类的静态方法中,供一次性调用返回java.sql ...
- vue 生命周期钩子 过滤器 计算属性
每一个Vue实例在被创建之前都要经过一系列的初始化过程.例如,实例需要配置数据观测.编译模板.挂载实例到DOM,然后在数据变化时更新DOM,在这个过程中,实例也会调用一些生命周期钩子,这就给我们提供了 ...
- jQuery easyui datagrid pagenation 的分页数据格式
{"total":28,"rows":[ {"productid":"FI-SW-01","unitco ...
- SQL2008中Merge的用法(转)
在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge ...
- Ruby module里的self
创建: 2018/03/15 更新: 2018/03/22 把标题ruby首字母大写 都知道def self.方法名 来定义类方法 class SampleClass def self.class_m ...
- 51nod 1220 约数之和【莫比乌斯反演+杜教筛】
首先由这样一个式子:\( d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1]\frac{pj}{q} \)大概感性证明一下吧我不会证 然后开始推: \[ \sum_{i=1 ...
- 第四代增强 NEW BADI的定义及实现
NEW BADI 是在第四代增强框架下创建的BADI,是相对于第三代增强Classic Badi 而言的. 根据第四代增强的基本概念,所有显式增强Enhancement options 都必须放在增强 ...