练习_简易文件管理器

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_简易文件管理器的更多相关文章

  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. 【Selenium】软件测试基础(软件测试分类和工具组)firebug、firepath的安装

    白盒测试:需要了解内部结构和代码 黑盒测试:不关心内部结构和代码 灰盒测试:介于白盒黑盒之间 静态测试:测试时不执行被测试软件 动态测试:测试时执行被测试软件 单元测试:测试软件的单元模块 集成测试: ...

  2. 如何正确使用log4j

      如何正确使用log4j? 关键字: 如何正确使用log4j? Java Web开发的过程中,通过会采用输出log的方式来进行调试,产品上线之后,也通常使用log来记录系统的运行状态.最简单的输出l ...

  3. hdu 5534

    题目描述:n个节点度数之和为n-2,每个节点预分配了1个度,任意分配度数是否有可能形成树? 从1到n节点,考虑树的形状,考虑分配给当前节点i的度数,并且注意到当前节点的度数不会影响其他节点(之前或者之 ...

  4. UI: 网易新闻实现

      #pragma mark-(AppDelegate.H文件)-------------------------------------------------------------------- ...

  5. js方式的页面跳转

    window.location.href="login.html";   (直接function里面执行 跳转)

  6. 我的周记6——"不破楼兰誓不还“

    周6 2019-06-13  天气:雨 这张照片是我那天中午回家的时候拍的,下着中雨.这是谁的孩子,又是谁的妈妈.看到这样的场景心里还是蛮有触动的, 因为我现在是离家千里的孩子,思念着故乡也想念着亲人 ...

  7. 32位Oracle10g在64位CentOS下安装失败记录

    环境信息:Alibaba Cloud Elastic Compute Service,CentOS Linux release 7.4.1708 (Core),16C/64GB. 使用32位Oracl ...

  8. Android中集成第三方支付

    常见的第三方支付解决方案 支付宝支付 微信支付 银联支付 Ping++统一支付平台(需要继承服务器端和客户端) 短信支付 支付宝的集成流程 相关资料链接: 支付宝支付指引流程:支付指引流程 支付宝An ...

  9. 转】R利剑NoSQL系列文章 之 Cassandra

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/3/ 感谢! R利剑NoSQL系列文章 之 Cassandr ...

  10. thinkphp3.2.3连接sqlserver 2008 R2 数据库

    环境: 操作系统——win7 64位旗舰版 PHP——thinkphp 3.23 数据库——Microsoft SQL Server 2008 R2 需要用到的软件: 步骤: 1.搜索SQLSRV30 ...