• 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
    可以删除 %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 个
    实际删除删除文件 %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 可以删除 %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)))

     

  • 相关阅读:
    Java 常用正则表达式
    MySql数据库备份的几种方式
    分布式系统一致性算法(Paxos)
    桥接模式
    vnc mirror driver
    VC Mirror Driver显示虚拟驱动经典开发
    基于MirrorDriver的录屏技术
    基于GDI和D3D的抓屏技术
    Various methods for capturing the screen
    IDE Goland DEBUG报错(could not launch process: decoding dwarf section info at offset 0x0: too short)
  • 原文地址:https://www.cnblogs.com/ltyandy/p/10960943.html
Copyright © 2020-2023  润新知