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();
現在來看看我們的效果:
這裏寫圖片描述

可以看出我們這裏還沒有圖標,以及鼠標雙擊響應函數,在下一節中我們會接着這裏繼續說。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章