MFC_VS清理器

Posted ltyandy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC_VS清理器相关的知识,希望对你有一定的参考价值。

 

VS清理器

界面

工程目录

列表控件ID改名IDC_FILELIST 绑定变量m_FileList

属性设置Accept Files 设置True

 技术图片

 

成员添加
// 用于保存待遍历的目录
    vector<CString> m_DirVec;
    // 保存待删除的文件
    vector<CString> m_WaitVec;
?
    // 保存可删除的文件个数
    DWORD m_DelCount = 0;
    // 保存所有文件的个数
    DWORD m_FileCount = 0;
?
    // 用于保存总文件的大小
    ULONGLONG m_CountSize = 0;
    // 用于保存可删除的大小
    ULONGLONG m_DelSize = 0;

 

WM_DROPFILES响应拖拽控件信息
// 响应文件的拖拽消息
void CVSClearDlg::OnDropFiles(HDROP hDropInfo)

    // 1. 获取到拖拽的所有文件和文件夹的的个数
    int count = DragQueryFile(hDropInfo, -1, nullptr, 0);
?
    // 2. 通过获取到的文件个数进行循环获取文件名
    for (int i = 0; i < count; ++i)
    
        // 2.1 申请空间用于保存文件的名称
        WCHAR FileName[MAX_PATH] =  0 ;
?
        // 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() == 0)
    
        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 =  0 ;
?
    // 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 (-1 != 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(0, FileName);
                
            
         while (FindNextFile(FindHandle, &FindInfo));
    

 

删除按钮处理事件

// 删除遍历到的符合要求的文件
void CVSClearDlg::OnBnClickedButton1()

    // 检查是否需要删除文件
    if (m_WaitList.GetItemCount() == 0)
    
        MessageBox(L"没有更多可删除的文件!");
        return;
    
?
    int FileCount = 0;
?
    // 遍历文件进行删除
    for (auto& FilePath : m_WaitVec)
    
        if (DeleteFile(FilePath))
        
            // 递增文件和大小
            FileCount++;
?
            // 删除成功,添加到列表
            m_DelList.InsertItem(0, 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清理器的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段6——CSS选择器

如何在 Rails 中清理 sql 片段

持久片段和查看器

损坏的顶点和片段着色器

python使用上下文对代码片段进行计时,非装饰器

使用编译器/链接器进行 C++ 代码清理