码迷,mamicode.com
首页 > 编程语言 > 详细

MFC_简易文件管理器

时间:2019-06-01 21:50:01      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:modify   report   etc   mfc   mode   stat   cad   wrap   知识   

练习_简易文件管理器

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

 

MFC_简易文件管理器

标签:modify   report   etc   mfc   mode   stat   cad   wrap   知识   

原文地址:https://www.cnblogs.com/ltyandy/p/10960965.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!