MFC_简易文件管理器

摘要:
练习_简单文件管理器Edit1编辑框绑定变量并初始化内容m_EditCtrl=L“D:”;添加List控件,设置属性报告,并向OnInitDialog()函数添加信息//初始化BOOLCFileManagerDlg::OnInitDialog(){CDialog::OnInitDialog();//初始化列表控件m_ListCtrl.SetExtendedStyle(LVS_EX_

练习_简易文件管理器

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

m_EditCtrl = L"D:";

MFC_简易文件管理器第1张

 

添加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);

免责声明:文章转载自《MFC_简易文件管理器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇web高拍仪图片上传java基础 Collections.sort的两种用法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MFC录制音频和播放音频

一、录制音频   在windows中提供了相应的API函数(waveIn这个族的函数)实现录音功能;在使用这些函数时,一定要引入相应的头文件 #include <windows.h> #include <Mmsystem.h> #pragram comment(lib, "Winmm.lib") 1、在开始录音之前,需要首先定义音频...

MFC的简单加法器(二)

   创建对话框主要分两大步,第一,创建对话框资源,主要包括创建新的对话框模板、设置对话框属性和为对话框添加各种控件;第二,生成对话框类,主要包括新建对话框类、添加控件变量和控件的消息处理函数等。鸡啄米在本节中先讲讲怎样创建对话框模板和设置对话框属性。        创建基于对话框的应用程序框架        之前鸡啄米创建的HelloWorld程序是单文...

VS2019 离线安装方法详解

本文详细介绍了 VS2019 离线安装的相关步骤,以桌面开发为主下载 C++桌面开发、.NET 桌面开发相关的工作负载、MFC 可选组件及帮助查看器。 工作负载(Workload) 离线安装需要先根据开发的项目类型下载相关的 工作负载(Workload)。工作负载包含多个依赖项,分为必需(Required)、建议(Recommended)、可选(Opti...

在MFC中使dialog自适应缩放

起因 最近用mfc做了不少小软件,界面上都是基于CDialog或者CFormView,界面不能缩放一直是问题。一个办法是在OnSize()里面调用所有控件的MoveWindow()函数,根据比例调整控件大小。但是在界面上控件比较多的时候,这个发放就显得很繁琐了。于是我写了一个CAutoResize类,去实现控件的统一缩放。 工作原理 原理上很简单,对于MF...

MFC--响应鼠标和键盘操作

一个程序最重要的部分之一是对鼠标和键盘操作的响应. 一. 理解鼠标事件.之前对鼠标事件的认识仅仅局限于处理控件的单击与双击事件.但实际鼠标的操作包含很多.这里将以一个画图的小程序讲解对鼠标的响应. 首先新建一个MFC程序,选择对话框类型,将Mouse设为程序标题.建立程序框架后将对话窗口中所有的控件删除.这样整个对话框都可以用来作图. 然后选中对话框窗口在...

如何学好VC和MFC(各前辈学习方法及感受整理)(三)

如何学习vc++(vc的用处) 1 vc的用处我感觉下面一些领域比较适合于用vc: 操作系统编程,game,图形设计,corba编程,com编程,网络编程。我谈谈我的体会。我现在在深圳的一家公司从事IP电话网关的开发。通过这个项目,我 才真正体会到VC有多么强大,上百个线程同时工作,数据库并发访问,而且全部软件基 于COM构造,这样高性能的大型软件,只有...