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++垃圾清理程序软件
概述 本程序软件的主要实现垃圾文件清理的功能,即对指定的文件格式的临时文件或垃圾文件进行遍历.扫描.显示.删除清理等功能.在程序界面设计方面,对默认对话框重新自定义绘制,主要包括标题栏的重绘.对话框边 ...
随机推荐
- RK3288 make otapackage 出错的问题【转】
本文转载自:http://blog.csdn.net/u010439962/article/details/51734631 Installed file list: out/target/produ ...
- 并不对劲的uoj276. [清华集训2016]汽水
想要很对劲的讲解,请点击这里 题目大意 有一棵\(n\)(\(n\leq 50000\))个节点的树,有边权 求一条路径使该路径的边权平均值最接近给出的一个数\(k\) 输出边权平均值下取整的整数部分 ...
- 使用Django.core.cache操作Memcached导致性能不稳定的分析过程
使用Django.core.cache操作Memcached导致性能不稳定的分析过程 最近测试一项目,用到了Nginx缓存服务,那可真是快啊!2Gb带宽都轻易耗尽. 不过Api接口无法简单使用Ngin ...
- js 获取url的request参数
方法1: function getRequest(strParame) { var args = new Object(); var query = location.search.substrin ...
- hdu 1348【凸包模板】
#include<iostream> #include<iostream> #include<algorithm> #include<cmath> us ...
- C#后台调用Http外网接口(GET, POST)
1.get方法调用接口获取json文件内容 public void GetFunction() { string serviceAddress = ...
- 原生JavaScript实战之搜索框筛选功能
成品图如下所示: 先搭建HTML结构: <div class="wrapper"> <div class="sWrapper"> < ...
- Spring Cloud Eureka配置文件例子与较为详细说明
Eureka服务端: application.yml # eureka(最)简单单点开发配置.支持yml与properties两种,yml文件后缀必须为yml,不能是yaml,否则找不到该文件,使用默 ...
- git修改push的注释信息
修改还未push的注释: git commit --amend 修改后保存退出. 刚刚push到远端还没有人其他人下载或改动的: git commit --amend进入修改页面修改注释信息,修改后: ...
- 用WEKA进行数据挖掘
学习于IBM教学文档 数据挖掘学习与weka使用 第二部 分分类和集群 分类 vs. 群集 vs. 最近邻 在我深入探讨每种方法的细节并通过 WEKA 使用它们之前,我想我们应该先理解每个模型 - 每 ...