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(, L"文件名", LVCFMT_CENTER, );
m_ListCtrl.InsertColumn(, L"修改时间", LVCFMT_CENTER, );
m_ListCtrl.InsertColumn(, L"类型", LVCFMT_CENTER, );
m_ListCtrl.InsertColumn(, L"大小", LVCFMT_CENTER, );
// 默认遍历 D 盘的内容
GetFileInfo(m_EditCtrl);
return ;
}
上面用到的相关函数

// 获取文件夹下的所有文件和目录
void CFileManagerDlg::GetFileInfo(CString FilePath)
{
// 1. 清空列表中已存在的数据
m_ListCtrl.DeleteAllItems();
// 2. 定义需要的数据
WIN32_FIND_DATA FileInfo = { };
// 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 = { };
FileTimeToLocalFileTime(&FileInfo.ftLastWriteTime, &LocalFileTime);
SYSTEMTIME SystemTime = { };
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, , 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, , TempString);
// 4. 根据类型进行大小的计算
if (FileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
m_ListCtrl.SetItemText(Count, , L"-");
else
{
TempString.Format(L"%.2lf MB", FileInfo.nFileSizeLow / 1024.0 / 1024.0);
m_ListCtrl.SetItemText(Count, , 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, );
// 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 = ;
}
在文件上右键弹出文件相关信息
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, );
//////////////////////////////////////////////////////////
// 弹出对话框
CMyFileDialog Dialog(FilePath);
Dialog.DoModal();
*pResult = ;
}
弹出窗口构造函数重载
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 = { };
// 获取类型
SHGetFileInfo(m_FileName, , &FileInfo, sizeof(SHFILEINFO), SHGFI_TYPENAME);
SetDlgItemText(IDC_EDIT2, FileInfo.szTypeName);
// 获取图标
SHGetFileInfo(m_FileName, , &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_简易文件管理器的更多相关文章
- C#编写一个简易的文件管理器
编写一个简易的文件管理器,通过本次实验,练习 TreeView.ListView 和SplitContainer 控件的使用,同时熟悉 C#文件系统的操作方法以及 File 类和 Directory类 ...
- C语言基于GTK+Libvlc实现的简易视频播放器(二)
简易视频播放器-全屏播放 一.课程说明 上一次我们使用gtk+libvlc实现了一个最简单的视频播放器,可以实现点击按钮暂定和停止播放视频,以及同步显 示视频播放进度,但即使作为一个视频播放器,只有这 ...
- C语言基于GTK+Libvlc实现的简易视频播放器
小编心语:现下,各种视频播放软件层出不穷,竞争也越演越烈,不知道大家有木有这个想法,小编有时在想能不能做一款属于自己的视频播放器呢~小编特意去实验楼,整理出了这篇关于如何实现简易视频播放器的博文.简易 ...
- 【原】iOS学习之文件管理器(NSFileManager)和文件对接器(NSFileHandle)
1.文件管理器(NSFileManager) 1> 主要作用及功能方法 主要作用:此类主要是对文件进行的操作(创建/删除/改名等)以及文件信息的获取. 功能方法: 2> 创建文件夹 创建所 ...
- 使用Windows Form 制作一个简易资源管理器
自制一个简易资源管理器----TreeView控件 第一步.新建project,进行基本设置:(Set as StartUp Project:View/Toolbox/TreeView) 第二步.开始 ...
- atitit. web 在线文件管理器最佳实践(1)--- elFinder 的使用流程解决之道 。打开浏览服务器文件夹java .net php
atitit. web 在线文件管理器最佳实践(1)--- elFinder 的使用流程解决之道 .打开浏览服务器文件夹java .net php 1. 环境:::项目java web,需要打开浏览服 ...
- Web 在线文件管理器学习笔记与总结(19)上传文件
dir.func.php 中添加方法: /* 上传文件 */ function uploadFile($fileInfo,$path,$allowExt = array('jpg','jpeg','p ...
- Web 在线文件管理器学习笔记与总结(17)复制文件 (18)剪切文件
(17)复制文件 ① 复制文件通过copy($src,$dst) 来实现 ② 检测目标目录是否存在,如果存在则继续检测目标目录中是否存在同名文件,如果不存在则复制成功 file.func.php 中添 ...
- Web 在线文件管理器学习笔记与总结(15)剪切文件夹 (16)删除文件夹
(15)剪切文件夹 ① 通过rename($oldname,$newname) 函数实现剪切文件夹的操作 ② 需要检测目标文件夹是否存在,如果存在还要检测目标目录中是否存在同名文件夹,如果不存在则剪切 ...
随机推荐
- ZOJ3261 Connections in Galaxy War —— 反向并查集
题目链接:https://vjudge.net/problem/ZOJ-3261 In order to strengthen the defense ability, many stars in g ...
- AngularJS 指令(Directives)实践指南
指令(Directives)是所有AngularJS应用最重要的部分.尽管AngularJS已经提供了非常丰富的指令,但还是经常需要创建应用特定的指令.这篇教程会为你讲述如何自定义指令,以及介绍如何在 ...
- python 列表,元祖,字典
一 列表 1 列表的循环遍历 namesList = ['xiaoWang','xiaoZhang','xiaoHua'] for name in namesList: print(name) 结果 ...
- 并不对劲的loj2134:uoj132:p2304:[NOI2015]小园丁与老司机
题目大意 给出平面直角坐标系中\(n\)(\(n\leq5*10^4\))个点,第\(i\)个点的坐标是\(x_i,y_i(|x_i|\leq10^9,1\leq y_i\leq10^9)\),只有朝 ...
- net share
IT知识梳理 2017-11-30 06:57:10 Dos 命令进阶(一)讲解思路 1.Net常用命令 (1)net share - 查看共享命令 net share ipc$ - 设置ipc$共享 ...
- 《Microsoft COCO Captions Data Collection and Evaluation Server》论文笔记
出处:CVPR2015 Motivation 本文描述了MSCoco标题数据集及评估服务器(Microsoft COCO Caption dataset and evaluation server), ...
- 关于XAMPP Apache无法启动问题解决方案
安装好XAMPP后,启动Apache服务启动失败,然后从xampp安装目录下执行apache_start.bat文件,如下图 显示443端口被占用. 解决方法: 启动cmd,输入netstat -a ...
- asp.net mvc4 不支持EF6
参考文章:http://www.cnblogs.com/zeusro/p/3403771.html http://q.cnblogs.com/q/40926/ 解决方法是 1.把EF6删除改用EF5. ...
- Gym 100531B Buffcraft (贪心+暴力+前缀和)
题意:给定两个加血的方式,一个是直接加多少,另一种是加百分之几,然后你能够你选 k 种,问你选哪 k 种. 析:首先肯定要选加的多的,所以我们先排序,从大到小,然后用前缀和存储一下,再去枚举从第一种和 ...
- E20170520-ts
regexp n. 正则表达式 metacharacter メタ文字 元字符 quote vt. 引述,引用; escape v. 逃脱; 逃离; n. 逃走; 逃跑工具或方法; reg ...