MFC制作本地文件系统(一)

前言

这是我之前做项目的时候一步步查阅慢慢做出来的,为方便以后使用,先记下来。
可能看标题还是有些模糊,我们先来看看效果图吧!
image
现在图片看完了,我们进入主题吧,我将一步一步实现本地的文件管理系统(PS:你过这里我只对List Control 控件进行讲述,而对上面的位图控件则不做概述了,想要了解如何做位图控件的小伙伴可以到我之前写的博客中查阅)。

代码实现

温馨提示 本项目中使用的是多字节编码,可以到项目属性的配置属性中选择常规,然后看到字符集,选择使用多字节字符集,如果不使用这个编码格式的话下面的代码很多字符将会报错,当然你也可以用Unicode字符集并对字符格式做相应的处理。

1、我们创建一个MFC对话框命名为LocalFileSys,在对话框中删除MFC自动创建的控件。
2、往对话框中插入List Control控件,并右键属性找到View栏,设置为Report,效果如下图:
这里写图片描述
3、右键控件选择添加添加变量,设置变量名为:m_local_list
4、来到LocalFileSysDlg.h文件下做声明,先添加一个数组用于存储磁盘符,跟两个函数如下:

public:

BYTE m_szLocalDiskDriverList[0x1000];
VOID InitLocalDiskDriverList();                     // 初始化本地磁盘驱动列表
int GetLocalIconIndex(LPCTSTR szVolume, DWORD dwFileAttributes);

5、实现上面声明的函数,来到LocalFileSysDlg.cpp下:

int CLocalFileSysDlg::GetLocalIconIndex(LPCTSTR szVolume, DWORD dwFileAttributes)
{
    SHFILEINFO sfi;

    if (dwFileAttributes == INVALID_FILE_ATTRIBUTES)
        dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
    else
        dwFileAttributes |= FILE_ATTRIBUTE_NORMAL; 

    SHGetFileInfo(
        szVolume,
        dwFileAttributes,
        &sfi,
        sizeof(SHFILEINFO),
        SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES
        );

    return sfi.iIcon;
}

VOID CLocalFileSysDlg::InitLocalDiskDriverList()
{
    // 在打开根目录是应该先清空掉里面的items
    m_local_list.DeleteAllItems();          
    while (m_local_list.DeleteColumn(0) != 0);

    m_local_list.InsertColumn(0, "名称", LVCFMT_LEFT, 80);
    m_local_list.InsertColumn(1, "类型", LVCFMT_RIGHT, 100);
    m_local_list.InsertColumn(2, "总大小", LVCFMT_RIGHT, 110);
    m_local_list.InsertColumn(3, "可用空间", LVCFMT_RIGHT, 110);

    m_local_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);

    char *Travel = NULL;

    /* 获取磁盘符 如C:\'\0'D:\'\0'E:\ 每个盘符之间用了'\0'做间隔*/
    GetLogicalDriveStrings(sizeof(m_szLocalDiskDriverList), (LPSTR)m_szLocalDiskDriverList);

    Travel = (char *)m_szLocalDiskDriverList;       // 因为有\0的缘故Travel表示c:\

    CHAR szFileSystem[MAX_PATH];
    unsigned __int64 ulHardDiskAmount = 0;      // 硬盘总大小
    unsigned __int64 ulHardDiskFreeSpace = 0;   // 硬盘空闲空间
    unsigned long    ulHardDiskAmountMB;        // 硬盘总大小 MB
    unsigned long    ulHardDiskFreeSpaceMB = 0;     // 剩余空间 MB

    for (int i = 0; *Travel != '\0'; i++, Travel += lstrlen(Travel) + 1)
    {
        // 获取磁盘相关信息
        memset(szFileSystem, 0, sizeof(szFileSystem));
        // 获取文件系统信息及大小
        GetVolumeInformation(Travel, NULL, 0, NULL, NULL, NULL, szFileSystem, MAX_PATH);

        ULONG ulFileSystemLength = lstrlen(szFileSystem) + 1;
        if (GetDiskFreeSpaceEx(Travel, (PULARGE_INTEGER)&ulHardDiskFreeSpace, (PULARGE_INTEGER)&ulHardDiskAmount, NULL))
        {
            // 将k转换为MB的形式
            ulHardDiskAmountMB = ulHardDiskAmount / 1024 / 1024;
            ulHardDiskFreeSpaceMB = ulHardDiskFreeSpace / 1024/ 1024;
        }
        else
        {
            ulHardDiskAmountMB = 0;
            ulHardDiskFreeSpaceMB = 0;
        }

        // 向本地list控件中插入磁盘信息
        // GetFileAttributes 获取指定文件或目录的属性
        // InsertItem 插入新的一行,里头第二参数最多设置项里的第一字段,而想设置其他字段的内容,要用SetItemText,简单地说,就是前者是为了创建,后者是为了编辑
        int iItem = m_local_list.InsertItem(i, Travel, GetLocalIconIndex(Travel, GetFileAttributes(Travel)));

        m_local_list.SetItemData(iItem, 1);

        SHFILEINFO sfi;
        // 获取系统信息
        SHGetFileInfo(Travel, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);
        m_local_list.SetItemText(iItem, 1, sfi.szTypeName);

        CString strCount;
        strCount.Format("%10.1f GB", (float)ulHardDiskAmountMB / 1024);
        m_local_list.SetItemText(iItem, 2, strCount);
        strCount.Format("%10.1f GB", (float)ulHardDiskFreeSpaceMB / 1024);
        m_local_list.SetItemText(iItem, 3, strCount);

    }
}

6、我们在LOcalFileSysDlg.cpp中找到OnInitDialog()函数,在里面添加我们刚刚编写的函数(PS:在// TODO: 在此添加额外的初始化代码后面添加),InitLocalDiskDriverList();
现在来看看我们的效果:
这里写图片描述

可以看出我们这里还没有图标,以及鼠标双击响应函数,在下一节中我们会接着这里继续说。

猜你喜欢

转载自blog.csdn.net/qq_34199383/article/details/81462724