zoukankan      html  css  js  c++  java
  • 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)))

     

  • 相关阅读:
    hlgoj 1766 Cubing
    Reverse Linked List
    String to Integer
    Bitwise AND of Numbers Range
    Best Time to Buy and Sell Stock III
    First Missing Positive
    Permutation Sequence
    Next Permutation
    Gray Code
    Number of Islands
  • 原文地址:https://www.cnblogs.com/ltyandy/p/10960943.html
Copyright © 2011-2022 走看看