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);
原文地址:https://www.cnblogs.com/ltyandy/p/10960965.html