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清理器的更多相关文章

  1. RAM清理器

    或许有些氨基小白不知道RAM是什么,官方的解释是"运行内存" 只要你的RAM够大,你玩什么都不卡! 今天给大家带来的就是 <RAM清理器>!!体积小,能量大就是我给他介 ...

  2. Python_练习_VS清理器

    #导入os import os #创建列表放入后缀 d=[ '.txt','obj','tlog','lastbuildstate','idb','pdb','pch','res','ilk','sd ...

  3. 著名清理软件(CCleaner) 5.24.5841 中文版

    软件名称: 著名清理软件(CCleaner) 软件语言: 多国语言 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 5.7MB 图片预览: 软件简介: CCleaner的体积小, ...

  4. CCleaner(著名清理软件) 5.21.5700 中文免费版(著名清理软件) 5.21.5700 中文免费版

    软件名称: CCleaner(著名清理软件) 5.21.5700 中文免费版著名清理软件(CCleaner)软件语言: 多国语言授权方式: 免费软件运行环境: Win 32位/64位软件大小: 5.6 ...

  5. Chapter5_初始化与清理_用构造器初始化

    接下来进入第五章,java中初始化和清理的问题,这是两个涉及安全的重要命题.初始化的功能主要是为库中的构件(或者说类中的域)初始化一些值,清理的功能主要是清除程序中不再被需要的元素,防止资源过分被垃圾 ...

  6. Spark源码剖析 - SparkContext的初始化(八)_初始化管理器BlockManager

    8.初始化管理器BlockManager 无论是Spark的初始化阶段还是任务提交.执行阶段,始终离不开存储体系.Spark为了避免Hadoop读写磁盘的I/O操作成为性能瓶颈,优先将配置信息.计算结 ...

  7. 给 Linux 系统“减肥”,系统垃圾清理_系统安装与配置管理_Linux Today - Google Chrome

    给 Linux 系统"减肥",系统垃圾清理  2013/10/16  linux  系统安装与配置管理  评论  15,555 Linux 计算机安装后,在我们不断的使用过程中,因 ...

  8. CCleaner 垃圾文件清理规则 编写指南

    以下内容的英文版本来源于 CCleaner 官方论坛,仅供参考.欢迎大家编写并分享针对常用国产软件的垃圾文件清理规则!需要说明的是规则文件(Winapp2.ini)需和程序文件放于同一文件夹下,才能被 ...

  9. Windows 开发之VC++垃圾清理程序软件

    概述 本程序软件的主要实现垃圾文件清理的功能,即对指定的文件格式的临时文件或垃圾文件进行遍历.扫描.显示.删除清理等功能.在程序界面设计方面,对默认对话框重新自定义绘制,主要包括标题栏的重绘.对话框边 ...

随机推荐

  1. bzoj3330: [BeiJing2013]分数

    口胡 题目hint都给你是一个三分函数了 还不会上三分套三分吗 exp函数又卡 精度又卡 什么sb毒瘤题 浪费时间

  2. windows系统下mysql5.5查看和设置数据库编码

    1.显示当前编码命令: show variables like 'char%'; 2.设置编码为utf8命令:set names 'utf8';

  3. 【FFT初识】

      FFT在用于解决多项式乘法A*B(A和B为多项式,形如a0+a1*x^1+a2*x^2....)的时候,通俗地解释就是: 原理:先根据各自的系数各自转化为对应的向量(O(nlogn)),然后向量相 ...

  4. 性能-发挥ORACLE分区表

    ORACLE分区表发挥性能 http://www.cnblogs.com/zwl715/p/3962837.html 1.1 分区表PARTITION table 在ORACLE里如果遇到特别大的表, ...

  5. BZOJ_3105_[cqoi2013]新Nim游戏_线性基+博弈论

    BZOJ_3105_[cqoi2013]新Nim游戏_线性基+博弈论 Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作 ...

  6. c#截图工具

    厚积薄发,丰富的公用类库积累,助你高效进行系统开发(6)----全屏截图.图标获取.图片打印.页面预览截屏.图片复杂操作等 俗话说,一个好汉十个帮,众人拾柴火焰高等都说明一个道理,有更多的资源,更丰富 ...

  7. 字符设备驱动另一种写法—mmap方法操作LED

    最近在看韦老师的视频,讲解了很多种字符设备的驱动写法.经过自己的研究之后,我发现还有另外一种写法,直接在应用层操作,省去了内核中的地址映射部分,使得用户可以在应用层直接操作LED.        mm ...

  8. 一种struts标签取不到值的情况

    编写一个网页,使用<s:date >标签将日期格式化,使用了多组数据一直没有问题,突然在一组数据上死活出现不了数据了.程序如下 <s:iterator value="art ...

  9. pascal倒序输出

    program Project6; {$APPTYPE CONSOLE} uses SysUtils; var a,b,c,d:integer; begin { TODO -oUser -cConso ...

  10. 通过实现ServletContextListener接口创建数据库连接池(C3P0方式)

    使用Listener步骤 1. 定义Listener实现类 2. 在web.xml中配置(或使用Annotation) 使用C3P0方式创建数据库连接池需要添加的jar包 1.c3p0-0.9.5.j ...