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. POJ1458 Common Subsequence —— DP 最长公共子序列(LCS)

    题目链接:http://poj.org/problem?id=1458 Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Tot ...

  2. 【T^T 1736】【FJUTOJ 1077】排座位

    http://59.77.139.92/problem.php?id=1077 水题,小心PE // <1736.cpp> - 11/12/16 17:17:52 // This file ...

  3. AutoIT: FileReadLine可以对文件进行读行操作

    $fHandle= ) Then $line= FileReadLine($fHandle) Then ExitLoop Wend EndIf FileClose($fHandle)

  4. linux内存管理之uboot第一步

    在进入讲解linux内存管理的kernel阶段以前,了解一下uboot阶段是如何准备好内存物理设备的,这是非常有意义的.通常进入到linux内核阶段之后,对内存芯片的物理特性寄存器访问是比较少的,强调 ...

  5. appcompat_v7 引起的新建Android工程编译不过的问题 (转载)

    转自:http://blog.csdn.net/zhao7134/article/details/34449641 eclipse adt 上新建基于Android4.4(kk)的Android项目时 ...

  6. 让CentOS启动后直接进入命令行模式(转载)

    转自:http://361324767.blog.163.com/blog/static/114902525201285101410206/ CentOS中如何进入图形界面和文字界面,Linux真正的 ...

  7. Unix\Linux | 总结笔记 | 用户管理

    1. useradd [选项] 用户名   用于创建新的用户 useradd命令中的用户参数以及作用 参数 作用 -d 指定用户的家目录(默认为/home/username) -e 账户的到期时间,格 ...

  8. BZOJ 3224 SBT 普通平衡树

    复习了一下SBT的模板,但是BZOJ不知道为什么注册不了,所以就没交,测了样例能过! #include <bits/stdc++.h> #include<algorithm> ...

  9. 洛谷 P3203 [HNOI2010]弹飞绵羊 || bzoj2002

    看来这个lct板子的确没什么问题 好像还可以分块做 #include<cstdio> #include<algorithm> using namespace std; type ...

  10. SpringCloud开发学习总结(七)—— 声明式服务调用Feign(一)

    在实践的过程中,我们会发现在微服务架构中实现客户端负载均衡的服务调用技术Spring Cloud Ribbon<SpringCloud开发学习总结(四)—— 客户端负载均衡Ribbon> ...