练习_简易文件管理器

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

m_EditCtrl = L"D:\";

添加List控件,属性设置report,OnInitDialog()函数里添加信息
  1. // 初始化函数
  2. BOOL CFileManagerDlg::OnInitDialog()
  3. {
  4. CDialog::OnInitDialog();

  5. // 初始化列表控件的风格
  6. m_ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

  7. // 初始化列表控件的列选项
  8. m_ListCtrl.InsertColumn(, L"文件名", LVCFMT_CENTER, );
  9. m_ListCtrl.InsertColumn(, L"修改时间", LVCFMT_CENTER, );
  10. m_ListCtrl.InsertColumn(, L"类型", LVCFMT_CENTER, );
  11. m_ListCtrl.InsertColumn(, L"大小", LVCFMT_CENTER, );

  12. // 默认遍历 D 盘的内容
  13. GetFileInfo(m_EditCtrl);

  14. return ;
  15. }
上面用到的相关函数

  1. // 获取文件夹下的所有文件和目录
  2. void CFileManagerDlg::GetFileInfo(CString FilePath)
  3. {
  4. // 1. 清空列表中已存在的数据
  5. m_ListCtrl.DeleteAllItems();

  6. // 2. 定义需要的数据
  7. WIN32_FIND_DATA FileInfo = { };

  8. // 3. 拼接路径为 D:\\* = FilePath + L"\\*"; 并且获取第一个文件
  9. HANDLE FindHanlde = FindFirstFile(FilePath + L"\\*", &FileInfo);

  10. // 4. 判断文件是否获取成功,并继续遍历
  11. if (INVALID_HANDLE_VALUE != FindHanlde)
  12. {
  13. do {
  14. // 5. 添加数据到列表中时,排除 . 目录
  15. if (_tcscmp(FileInfo.cFileName, L"."))
  16. {
  17. // 6. 向列表内添加数据
  18. InsetFileInfo(FileInfo);
  19. }
  20. // 7. 遍历下一个文件
  21. } while (FindNextFile(FindHanlde, &FileInfo));
  22. }
  23. }
  24. // 向列表中添加数据
  25. void CFileManagerDlg::InsetFileInfo(WIN32_FIND_DATA& FileInfo)
  26. {
  27. CString TempString;

  28. // 0. 获取当前列表最后一个位置
  29. int Count = m_ListCtrl.GetItemCount();

  30. // 1. 在列表中添加一行名称
  31. m_ListCtrl.InsertItem(Count, FileInfo.cFileName);

  32. // 2. 添加修改时间
  33. FILETIME LocalFileTime = { };
  34. FileTimeToLocalFileTime(&FileInfo.ftLastWriteTime, &LocalFileTime);
  35. SYSTEMTIME SystemTime = { };
  36. FileTimeToSystemTime(&LocalFileTime, &SystemTime);
  37. TempString.Format(L"%d/%d/%d/%d:%d:%d", SystemTime.wYear, SystemTime.wMonth,
  38. SystemTime.wDay, SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond);
  39. m_ListCtrl.SetItemText(Count, , TempString);

  40. // 3. 添加类型,属性
  41. TempString = L"";
  42. if (FileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  43. TempString += L"目录 ";
  44. else
  45. TempString += L"文件 ";
  46. if (FileInfo.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
  47. TempString += L"隐藏 ";
  48. m_ListCtrl.SetItemText(Count, , TempString);

  49. // 4. 根据类型进行大小的计算
  50. if (FileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  51. m_ListCtrl.SetItemText(Count, , L"-");
  52. else
  53. {
  54. TempString.Format(L"%.2lf MB", FileInfo.nFileSizeLow / 1024.0 / 1024.0);
  55. m_ListCtrl.SetItemText(Count, , TempString);
  56. }



  57. }

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

  1. // 左键双击的点击
  2. void CFileManagerDlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)
  3. {
  4. LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
  5.  
  6. // 获取当前的路径,保存编辑框中
  7. UpdateData(TRUE);

  8. // 1. 拼接点击的到的文件或目录对应的全路径
  9. CString FilePath = m_EditCtrl + L"\\" +
  10. m_ListCtrl.GetItemText(pNMItemActivate->iItem, );

  11. // 2. 判断是不是一个目录
  12. if (GetFileAttributes(FilePath) & FILE_ATTRIBUTE_DIRECTORY)
  13. {
  14. // 3. 如果是目录就继续遍历
  15. GetFileInfo(FilePath);

  16. // 4. 更新当前所在的路径
  17. WCHAR * Name = nullptr;
  18. GetFullPathName(FilePath.GetBuffer(), MAX_PATH,
  19. m_EditCtrl.GetBuffer(MAX_PATH), &Name);
  20. UpdateData(FALSE);
  21. }

  22. *pResult = ;
  23. }
在文件上右键弹出文件相关信息
  1. void CFileManagerDlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
  2. {
  3. LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);

  4. // 拼接路径并传入到构造函数中
  5. UpdateData(TRUE);
  6.  
  7. //////////////////////////////////////////////////////////
  8. CString FilePath = m_EditCtrl + L"\\" + m_ListCtrl.GetItemText(pNMItemActivate->iItem, );
  9. //////////////////////////////////////////////////////////

  10. // 弹出对话框
  11. CMyFileDialog Dialog(FilePath);
  12. Dialog.DoModal();

  13. *pResult = ;
  14. }

弹出窗口构造函数重载

  1. CMyFileDialog::CMyFileDialog(CString FileName, CWnd* pParent /*=nullptr*/)
  2. : CDialogEx(IDD_FILEDIALOG, pParent)
  3. {
  4. GetFullPathName(FileName.GetBuffer(), MAX_PATH,
  5. m_FileName.GetBuffer(MAX_PATH), &Name);
  6. }
弹出窗口初始化
  1. // 初始化对话框,显示数据
  2. BOOL CMyFileDialog::OnInitDialog()
  3. {
  4. CDialogEx::OnInitDialog();

  5. // 创建结构体用于保存文件内容
  6. SHFILEINFO FileInfo = { };

  7. // 获取类型
  8. SHGetFileInfo(m_FileName, , &FileInfo, sizeof(SHFILEINFO), SHGFI_TYPENAME);
  9. SetDlgItemText(IDC_EDIT2, FileInfo.szTypeName);

  10. // 获取图标
  11. SHGetFileInfo(m_FileName, , &FileInfo, sizeof(SHFILEINFO), SHGFI_ICON);
  12. SendDlgItemMessage(IDC_STATIC1, STM_SETICON, (WPARAM)FileInfo.hIcon, NULL);

  13. // 输出名字
  14. SetDlgItemText(IDC_EDIT1, Name);

  15. // 设置对话框内的属性
  16. int attr = GetFileAttributes(m_FileName);

  17. if (attr & FILE_ATTRIBUTE_HIDDEN)
  18. SendDlgItemMessage(IDC_CHECK2, BM_SETCHECK, BST_CHECKED);
  19. if (attr & FILE_ATTRIBUTE_READONLY)
  20. SendDlgItemMessage(IDC_CHECK1, BM_SETCHECK, BST_CHECKED);

  21. return TRUE;
  22. }
弹出窗口确认按钮更改复选框对应的属性应用到文件夹上
  1. // 应用设置
    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);
  2.  
  3. CDialogEx::OnOK();
    }

知识点

_tcscmp应用
  1. // 5. 添加数据到列表中时,排除 . 目录
    if (_tcscmp(FileInfo.cFileName, L"."))
    {
    // 6. 向列表内添加数据
    InsetFileInfo(FileInfo);
    }
GetFullPathName 消除重复的路径
  1. GetFullPathName(FilePath.GetBuffer(), MAX_PATH,
  2. m_EditCtrl.GetBuffer(MAX_PATH), &Name);
SHFILEINFO 结构体
  1. // 创建结构体用于保存文件内容
  2. SHFILEINFO FileInfo = { 0 };
  3.  
  4. // 获取类型
  5. SHGetFileInfo(m_FileName, 0, &FileInfo, sizeof(SHFILEINFO), SHGFI_TYPENAME);
  6. SetDlgItemText(IDC_EDIT2, FileInfo.szTypeName);

MFC_简易文件管理器的更多相关文章

  1. C#编写一个简易的文件管理器

    编写一个简易的文件管理器,通过本次实验,练习 TreeView.ListView 和SplitContainer 控件的使用,同时熟悉 C#文件系统的操作方法以及 File 类和 Directory类 ...

  2. C语言基于GTK+Libvlc实现的简易视频播放器(二)

    简易视频播放器-全屏播放 一.课程说明 上一次我们使用gtk+libvlc实现了一个最简单的视频播放器,可以实现点击按钮暂定和停止播放视频,以及同步显 示视频播放进度,但即使作为一个视频播放器,只有这 ...

  3. C语言基于GTK+Libvlc实现的简易视频播放器

    小编心语:现下,各种视频播放软件层出不穷,竞争也越演越烈,不知道大家有木有这个想法,小编有时在想能不能做一款属于自己的视频播放器呢~小编特意去实验楼,整理出了这篇关于如何实现简易视频播放器的博文.简易 ...

  4. 【原】iOS学习之文件管理器(NSFileManager)和文件对接器(NSFileHandle)

    1.文件管理器(NSFileManager) 1> 主要作用及功能方法 主要作用:此类主要是对文件进行的操作(创建/删除/改名等)以及文件信息的获取. 功能方法: 2> 创建文件夹 创建所 ...

  5. 使用Windows Form 制作一个简易资源管理器

    自制一个简易资源管理器----TreeView控件 第一步.新建project,进行基本设置:(Set as StartUp Project:View/Toolbox/TreeView) 第二步.开始 ...

  6. atitit. web 在线文件管理器最佳实践(1)--- elFinder 的使用流程解决之道 。打开浏览服务器文件夹java .net php

    atitit. web 在线文件管理器最佳实践(1)--- elFinder 的使用流程解决之道 .打开浏览服务器文件夹java .net php 1. 环境:::项目java web,需要打开浏览服 ...

  7. Web 在线文件管理器学习笔记与总结(19)上传文件

    dir.func.php 中添加方法: /* 上传文件 */ function uploadFile($fileInfo,$path,$allowExt = array('jpg','jpeg','p ...

  8. Web 在线文件管理器学习笔记与总结(17)复制文件 (18)剪切文件

    (17)复制文件 ① 复制文件通过copy($src,$dst) 来实现 ② 检测目标目录是否存在,如果存在则继续检测目标目录中是否存在同名文件,如果不存在则复制成功 file.func.php 中添 ...

  9. Web 在线文件管理器学习笔记与总结(15)剪切文件夹 (16)删除文件夹

    (15)剪切文件夹 ① 通过rename($oldname,$newname) 函数实现剪切文件夹的操作 ② 需要检测目标文件夹是否存在,如果存在还要检测目标目录中是否存在同名文件夹,如果不存在则剪切 ...

随机推荐

  1. Error CREATEing SolrCore 'new_core': Unable to create core [new_core] Caused by: Can't find resource 'solrconfig.xml' in classpath or 'D:\solr\solr-7.2.1\server\solr\new_core'

    \solr-7.2.1\server\solr\configsets\_default  下的conf  复制到:   \solr-7.2.1\server\solr\new_core

  2. C# ref和out总结

    C# 中ref 与 out 总结   参数的传递一般分为两种:一种是“值传递”即:传递实参的拷贝,既然是拷贝那么在函数中对这个形参所作的任何动作都不会反映到原来的实参中.另外一种是“引用传递”即:传递 ...

  3. BZOJ_3448_[Usaco2014 Feb]Auto-complete_Trie树

    BZOJ_3448_[Usaco2014 Feb]Auto-complete_Trie Description Bessie the cow has a new cell phone and enjo ...

  4. GIT+Gitolite+Gerrit 环境搭建 ***

    系统环境:Ubuntu12.04 服务器上安装git+gitolite+gitweb root@server: 为搭建git服务器终端,假设ID为 192.168.199.117 或域名为: http ...

  5. .NETFramework-Drawing:Font

    ylbtech-.NETFramework-Drawing:Font 1.返回顶部 1. #region 程序集 System.Drawing, Version=4.0.0.0, Culture=ne ...

  6. java.lang.NoSuchMethodError: org.springframework.web.context.ConfigurableWebApplicationContext.setId

    运行spring报了这个错误,网上说是spring版本冲突,检查maven依赖,发现我依赖的是spring-core.3.0.5,但是spring-orm和spring-tx依赖了spring-bea ...

  7. MongoDB安全事件的防范与反思

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 近段时间来,全球范围内数以万计的MongoDB实例被攻击,作为旨在为用户提供最优MongoDB云服务的网易蜂 ...

  8. PCB 合拼遍历(全排序+旋转90度) 基本遍历方法

    分享一下PCB合拼的组合的遍历方法,在分享之前先纠正一下 PCB拼板之多款矩形排样算法实现--学习  时间复杂度计算错误  一.PCB 合拼(全排序+旋转90度)的时间复杂度是多少? 二.合拼遍历(全 ...

  9. Luogu P1083 借教室【二分答案/差分】By cellur925

    题目描述 Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海 ...

  10. 数据结构 - 顺序栈的实行(C语言)

    数据结构-顺序栈的实现 1 顺序栈的定义 既然栈是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化,我们简称为顺序栈.线性表是用数组来实现的,对于栈这种只能一头插入删除的线性表来说,用数组哪 ...