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

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

时间: 2024-08-18 04:52:16

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

File类的深度学习(超简易文件管理器)——《Thinking in Java》随笔028

1 //: MakeDirectories.java 2 package c10; 3 4 import java.io.File; 5 import java.text.SimpleDateFormat; 6 import java.util.Date; 7 8 /** 9 * @time: 下午7:59:23 10 * @date: 2017年4月29日 11 * @auther: skyfffire 12 * @version: v0.1 13 */ 14 public class Mak

Midnight Commander强大的命令行文件管理器

Midnight Commander是一个对用户友好且强大的可视化字符界面文件管理器,不管你是新手还是高级用户,你都能轻而易举的使用它,它可以运行在系统控制台.xterm或者其他任何的伪终端设备.Midnight Commander为Unix类操作系统提供了一个清晰.友好.安全的操作接口,它使很多频繁的文件操作更有效率且保留了在命令行下的强大特性. Midnight Commander允许用户在命令行模式下使用屏幕的大部分空间来管理文件并且提供了一个清洗的文件层次结构,当然,在Telnet或者S

PHP服务器文件管理器开发小结(一):功能规划

为了更好的学习PHP.AJAX和LAMP等,为搭建PHP服务器打下基础,作者尝试开发一款基于PHP的服务器文件管理器,并且在管理过程中使用AJAX而不刷新页面. 文件管理器包含以下基本操作 当前文件夹 回到首文件夹 回到上一级文件夹 刷新文件夹视图 上传文件 新建文件 新建子文件夹 文件操作 查看内容 编辑内容 下载 重命名 移动 删除 文件夹操作 重命名 删除 基本上实现了以上功能后,一个比较完善的服务器文件管理器就形成了. 注意,本示例仅考虑Apache可操作的权限,不考虑提权的情况. 管理

iOS学习之文件管理器(NSFileManager)和文件对接器(NSFileHandle)

1.文件管理器(NSFileManager) 1> 创建文件夹 创建所需的方法在头文件的声明: /* createDirectoryAtPath:withIntermediateDirectories:attributes:error: creates a directory at the specified path. If you pass 'NO' for createIntermediates, the directory must not exist at the time this

UI14-沙盒机制,文件的读写,文件管理器的增删移动复制,归档和反归档。

1.复杂对象的归档反归档.person类的使用acoder,进行编码.使用decoder进行根据标记,解码. 2.再使用多个person类中,需要转化工具和解转化工具,achiver,unchiever,记得结束要finish. 3.文件管理器 对文件和文件夹的增删改移动. 4.读取沙盒的文件,和三个主要路径 5.简单类的读取写入,string,数组,和字典.

2015 IOS 文件管理器 ——在蓝懿教育 学习笔记

得到文件管理器   蓝懿教育 NSFileManager *fm = [NSFileManager defaultManager]; //    复制 //    [fm copyItemAtPath:@"/Users/ivan/Desktop/a.png" toPath:@"/Users/ivan/Desktop/copy/a.png" error:nil]; //    移动  移动的时候目的地不能有重名的 //    [fm moveItemAtPath:@&

Web 在线文件管理器学习笔记与总结(5)

① 读出要修改的文件的内容 ② 进行修改 ③ 将修改后的内容写进文件 index.php: <?php require 'dir.func.php'; require 'file.func.php'; require 'common.func.php'; $path = 'file'; $info = readDirectory($path); $act = @$_REQUEST['act']; $filename = @$_REQUEST['filename']; //跳转变量 $redire

Web 在线文件管理器学习笔记与总结(2)显示文件列表(名称,类型,大小,可读,可写,可执行,创建时间,修改时间,访问时间)

主要函数: filetype() 判断文件类型 filesize() 得到文件大小(字节) is_readable() 判断文件是否可读 is_writeable() 判断文件是否可写 is_executable() 判断文件是否可执行 filectime() 文件创建时间 filemtime() 文件修改时间 fileatime() 文件访问时间 file.func.php 封装文件操作的文件: <?php /* 转换字节大小 */ function transByte($size){ $ar

码工的工具:全局鼠标手势与explorer文件管理器的tab插件

qttabbar与firefox的多标签浏览一样的功能,非常强大. 对于你我这样的需要打开n个文件夹的人来说,这东西太强大了. 看图片吧. 对于strokeit就跟firefox的手势一样的强大. 这时,就算chrome,ie没有手势,你也可以对它来定制后退,前进,关闭的手势了. 还是看图再自己定制试试吧. 码工的工具:全局鼠标手势与explorer文件管理器的tab插件,布布扣,bubuko.com