练习_简易文件管理器

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. javascript正则找script标签, link标签里面的src或者 href属性

    1. [代码]javascript 简单的search    <script(?:(?:\s|.)+?)src=[\"\'](.+?)[\"\'](?!\<)(?:(? ...

  2. html5--7-33 阶段练习5

    html5--7-33 阶段练习5 总结: 1.JS中可以递归函数 2.js中数组对象array的使用 学习要点 综合运用学过的知识完成三个综合小练习,巩固学过的知识. 阶段小练习5-1:使用递归算法 ...

  3. windows 操作系统问题的解决

    浏览器之间具有较大的差异: 如果某问题只存在于某浏览器,而其他浏览器不存在此问题,则说明,问题出在该浏览器上: 或者是缓存已满:⇒ 清除缓存: 或者浏览器的兼容性问题: 1. error 1327. ...

  4. robotframework执行用例时,报错selenium.common.exceptions.WebDriverException: Message: unknown error: cannot get automation extension from unknown error: page could not be found: chrome-extension://aapnijgdinl

    在用robotframework编写移动端测试用例(用chrome浏览器模拟手机浏览器),执行用例时, 报错selenium.common.exceptions.WebDriverException: ...

  5. SLC-测试-Postman:Postman 工具

    ylbtech-SLC-测试-Postman:Postman 工具 1.返回顶部 1. 一.Request 请求 Request 请求,我们只介绍常用的四种:GET.POST.PUT.DELETE,其 ...

  6. ACGAN 论文笔记

    <Conditional Image Synthesis With Auxiliary Classifier GANs> Odena A, Olah C, Shlens J. Condit ...

  7. Ajax跨域访问等问题

    前端时间公司接口整顿,所有接口放一起了,然后我就写了一大堆API接口....... 今天用上了,公用人员库,前台通过ajax访问, 先是以‘json’作为数据格式进行访问,直接response fie ...

  8. AWS EC2中部署Apache服务器(LAMP)

    关键词: 1.新建aws ec2实例 2.使用putty连接到aws ec2 实例(SSH协议) 3.使用filezilla连接到aws ec2实例(SFTP协议) 4.在aws ec2上部署apac ...

  9. 【黑金教程笔记之001】veriloghdl 扫盲文—笔记&勘误

    001_veriloghdl 扫盲文—笔记&勘误 2014/10/31 原文作者:akuei2 联系方式:blog.ednchina.con/akuei2 勘误001: Page 3 0.1 ...

  10. bzoj 4951: [Wf2017]Money for Nothing【分治】

    参考:https://blog.csdn.net/herobrine_tkj/article/details/78404426?locationNum=8&fps=1 为什么从1开始存就挂了, ...