• MFC_简易文件管理器


    练习_简易文件管理器

    Edit1编辑框绑定变量,初始化内容

    m_EditCtrl = L"D:";

     

    添加List控件,属性设置report,OnInitDialog()函数里添加信息
    // 初始化函数
    BOOL CFileManagerDlg::OnInitDialog()
    {
        CDialog::OnInitDialog();
    ​
        // 初始化列表控件的风格
        m_ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
    ​
        // 初始化列表控件的列选项
        m_ListCtrl.InsertColumn(0, L"文件名", LVCFMT_CENTER, 200);
        m_ListCtrl.InsertColumn(1, L"修改时间", LVCFMT_CENTER, 150);
        m_ListCtrl.InsertColumn(2, L"类型", LVCFMT_CENTER, 140);
        m_ListCtrl.InsertColumn(3, L"大小", LVCFMT_CENTER, 100);
    ​
        // 默认遍历 D 盘的内容
        GetFileInfo(m_EditCtrl);
    ​
        return 0;
    }

     

    上面用到的相关函数

    // 获取文件夹下的所有文件和目录
    void CFileManagerDlg::GetFileInfo(CString FilePath)
    {
        // 1. 清空列表中已存在的数据
        m_ListCtrl.DeleteAllItems();
    ​
        // 2. 定义需要的数据
        WIN32_FIND_DATA FileInfo = { 0 };
    ​
        // 3. 拼接路径为 D:\* = FilePath + L"\*"; 并且获取第一个文件
        HANDLE FindHanlde = FindFirstFile(FilePath + L"\*", &FileInfo);
    ​
        // 4. 判断文件是否获取成功,并继续遍历
        if (INVALID_HANDLE_VALUE != FindHanlde)
        {
            do {
                // 5. 添加数据到列表中时,排除 . 目录
                if (_tcscmp(FileInfo.cFileName, L"."))
                {
                    // 6. 向列表内添加数据
                    InsetFileInfo(FileInfo);
                }
                // 7. 遍历下一个文件
            } while (FindNextFile(FindHanlde, &FileInfo));
        }
    }
    // 向列表中添加数据
    void CFileManagerDlg::InsetFileInfo(WIN32_FIND_DATA& FileInfo)
    {
        CString TempString;
    ​
        // 0. 获取当前列表最后一个位置
        int Count = m_ListCtrl.GetItemCount();
    ​
        // 1. 在列表中添加一行名称
        m_ListCtrl.InsertItem(Count, FileInfo.cFileName);
    ​
        // 2. 添加修改时间
        FILETIME LocalFileTime = { 0 };
        FileTimeToLocalFileTime(&FileInfo.ftLastWriteTime, &LocalFileTime);
        SYSTEMTIME SystemTime = { 0 };
        FileTimeToSystemTime(&LocalFileTime, &SystemTime);
        TempString.Format(L"%d/%d/%d/%d:%d:%d", SystemTime.wYear, SystemTime.wMonth,
            SystemTime.wDay, SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond);
        m_ListCtrl.SetItemText(Count, 1, TempString);
    ​
        // 3. 添加类型,属性
        TempString = L"";
        if (FileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            TempString += L"目录 ";
        else
            TempString += L"文件 ";
        if (FileInfo.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
            TempString += L"隐藏 ";
        m_ListCtrl.SetItemText(Count, 2, TempString);
    ​
        // 4. 根据类型进行大小的计算
        if (FileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            m_ListCtrl.SetItemText(Count, 3, L"-");
        else
        {
            TempString.Format(L"%.2lf MB", FileInfo.nFileSizeLow / 1024.0 / 1024.0);
            m_ListCtrl.SetItemText(Count, 3, TempString);
        }
    ​
    ​
    ​
    }

    选择文件左键双击进入下个文件

    // 左键双击的点击
    void CFileManagerDlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)
    {
        LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
        
        // 获取当前的路径,保存编辑框中
        UpdateData(TRUE);
    ​
        // 1. 拼接点击的到的文件或目录对应的全路径
        CString FilePath = m_EditCtrl + L"\" + 
            m_ListCtrl.GetItemText(pNMItemActivate->iItem, 0);
    ​
        // 2. 判断是不是一个目录
        if (GetFileAttributes(FilePath) & FILE_ATTRIBUTE_DIRECTORY)
        {
            // 3. 如果是目录就继续遍历
            GetFileInfo(FilePath);
    ​
            // 4. 更新当前所在的路径
            WCHAR * Name = nullptr;
            GetFullPathName(FilePath.GetBuffer(), MAX_PATH, 
                m_EditCtrl.GetBuffer(MAX_PATH), &Name);
            UpdateData(FALSE);
        }
    ​
        *pResult = 0;
    }

    在文件上右键弹出文件相关信息
    void CFileManagerDlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
    {
        LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    ​
        // 拼接路径并传入到构造函数中
        UpdateData(TRUE);
        
        //////////////////////////////////////////////////////////
        CString FilePath = m_EditCtrl + L"\" + m_ListCtrl.GetItemText(pNMItemActivate->iItem, 0);
        //////////////////////////////////////////////////////////
    // 弹出对话框
        CMyFileDialog Dialog(FilePath);
        Dialog.DoModal();
    ​
        *pResult = 0;
    }

     

    弹出窗口构造函数重载

    CMyFileDialog::CMyFileDialog(CString FileName, CWnd* pParent /*=nullptr*/)
        : CDialogEx(IDD_FILEDIALOG, pParent)
    {
        GetFullPathName(FileName.GetBuffer(), MAX_PATH,
            m_FileName.GetBuffer(MAX_PATH), &Name);
    }
    弹出窗口初始化
    // 初始化对话框,显示数据
    BOOL CMyFileDialog::OnInitDialog()
    {
        CDialogEx::OnInitDialog();
    ​
        // 创建结构体用于保存文件内容
        SHFILEINFO FileInfo = { 0 };
    ​
        // 获取类型
        SHGetFileInfo(m_FileName, 0, &FileInfo, sizeof(SHFILEINFO), SHGFI_TYPENAME);
        SetDlgItemText(IDC_EDIT2, FileInfo.szTypeName);
    ​
        // 获取图标
        SHGetFileInfo(m_FileName, 0, &FileInfo, sizeof(SHFILEINFO), SHGFI_ICON);
        SendDlgItemMessage(IDC_STATIC1, STM_SETICON, (WPARAM)FileInfo.hIcon, NULL);
    ​
        // 输出名字
        SetDlgItemText(IDC_EDIT1, Name);
    ​
        // 设置对话框内的属性
        int attr = GetFileAttributes(m_FileName);
    ​
        if (attr & FILE_ATTRIBUTE_HIDDEN)
            SendDlgItemMessage(IDC_CHECK2, BM_SETCHECK, BST_CHECKED);
        if (attr & FILE_ATTRIBUTE_READONLY)
            SendDlgItemMessage(IDC_CHECK1, BM_SETCHECK, BST_CHECKED);
    ​
        return TRUE;
    }
    ​
    弹出窗口确认按钮更改复选框对应的属性应用到文件夹上
    // 应用设置
    void CMyFileDialog::OnBnClickedButton2()
    {
    // 获取默认的属性
    int attr = GetFileAttributes(m_FileName);

    if (SendDlgItemMessage(IDC_CHECK2, BM_GETCHECK) == BST_CHECKED)
    attr |= FILE_ATTRIBUTE_HIDDEN;
    else
    attr &= ~FILE_ATTRIBUTE_HIDDEN;

    if (SendDlgItemMessage(IDC_CHECK1, BM_GETCHECK) == BST_CHECKED)
    attr |= FILE_ATTRIBUTE_READONLY;
    else
    attr &= ~FILE_ATTRIBUTE_READONLY;

    // 设置修改后的属性
    SetFileAttributes(m_FileName, attr);

    CDialogEx::OnOK();
    }

    知识点

    _tcscmp应用
    // 5. 添加数据到列表中时,排除 . 目录
    if (_tcscmp(FileInfo.cFileName, L"."))
    {
    // 6. 向列表内添加数据
    InsetFileInfo(FileInfo);
    }
    GetFullPathName 消除重复的路径
    GetFullPathName(FilePath.GetBuffer(), MAX_PATH, 
    			m_EditCtrl.GetBuffer(MAX_PATH), &Name);
    

     

    SHFILEINFO 结构体
    // 创建结构体用于保存文件内容
    	SHFILEINFO FileInfo = { 0 };
    
    	// 获取类型
    	SHGetFileInfo(m_FileName, 0, &FileInfo, sizeof(SHFILEINFO), SHGFI_TYPENAME);
    	SetDlgItemText(IDC_EDIT2, FileInfo.szTypeName);
    
  • 相关阅读:
    spring+mybatis多数据源切换
    【linux环境下】RabbitMq的安装和监控插件安装
    Slurm远程登录Jupyter Notebook
    Google Colab 使用
    关于conda和jupyter使用
    关于给C盘扩容以及动态磁盘
    关于使用实验室服务器的GPU以及跑上TensorFlow代码
    一些更改的后端接口和代码
    MarkDown to PDF
    蜗牛慢慢爬 LeetCode 25. Reverse Nodes in k-Group [Difficulty: Hard]
  • 原文地址:https://www.cnblogs.com/ltyandy/p/10960965.html
Copyright © 2020-2023  润新知