MFC製作本地文件系統(三)

前序

上一步我們實現了雙擊響應事件,這節我們將在裏面添加響應函數。函數主要是用於雙擊一個文件夾後進入到該文件夾內部,並可以通過雙擊 ..兩個點這一欄回到上級目錄。

實現

1、我們來到LocalFileSysDlg.h文件下,我們在CLocalFileSysDlg類裏面聲明如下一些變量及函數

VOID FixedLocalFileList(CString strDirectory = "");
CString GetParentDirectory(CString strPath);

CString m_Local_File_Path;

其中:
FixedLocalFileList函數主要是用於文件夾跳轉
GetParentDirectory函數主要是獲取上級目錄地址
m_Local_File_Path變量則是用於保存當前的文件夾路徑。

2、我們來到LocalFileSysDlg.cpp文件下,在這裏添加上面聲明的函數的實現體。

CString CLocalFileSysDlg::GetParentDirectory(CString strPath)
{
    CString strCurrentPath = strPath;
    int iIndex = strCurrentPath.ReverseFind('\\');      // 查找最後一個'\\'
    if (-1 == iIndex) {
        return strCurrentPath;
    }
    CString strCurrentSubPath = strCurrentPath.Left(iIndex);    // 取左邊
    iIndex = strCurrentSubPath.ReverseFind('\\');
    if (-1 == iIndex) {
        strCurrentPath = "";
        return strCurrentPath;
    }

    strCurrentPath = strCurrentSubPath.Left(iIndex);

    if (strCurrentPath.Right(1) != "\\")
        strCurrentPath += "\\";

    return strCurrentPath;
}

VOID CLocalFileSysDlg::FixedLocalFileList(CString strDirectory)
{
    if (strDirectory.GetLength() == 0)
    {
        int iItem = m_local_list.GetSelectionMark();                    // 獲取選中的項

        // 在list控件中選中
        if (iItem != -1)
        {
            if (m_local_list.GetItemData(iItem) == 1)
            {
                strDirectory = m_local_list.GetItemText(iItem, 0);      // 獲取路徑地址
            }
        }
    }

    // 每次打開一個文件夾時 第一行使用 ".."代表上級目錄 
    // 雙擊".." 時返回上級目錄
    if (strDirectory == "..")
    {
        m_Local_File_Path = GetParentDirectory(m_Local_File_Path);
    }
    // 刷新當前目錄
    else if (strDirectory != ".")
    {
        m_Local_File_Path += strDirectory;
        if (m_Local_File_Path.Right(1) != "\\")
        {
            m_Local_File_Path += "\\";
        }
    }

    // 是驅動器的根目錄,返回磁盤列表
    if (m_Local_File_Path.GetLength() == 0)
    {
        InitLocalDiskDriverList();      // ..
        return;
    }

    // 插入新的文件目錄
    m_local_list.DeleteAllItems();
    while (m_local_list.DeleteColumn(0) != 0);      // 刪除

    m_local_list.InsertColumn(0, "名稱",  LVCFMT_LEFT, 200);
    m_local_list.InsertColumn(1, "大小", LVCFMT_LEFT, 100);
    m_local_list.InsertColumn(2, "類型", LVCFMT_LEFT, 100);
    m_local_list.InsertColumn(3, "修改日期", LVCFMT_LEFT, 115);

    int iItemIndex = 0;

    // InsertItem向list控件中插入列表項
    m_local_list.SetItemData(m_local_list.InsertItem(iItemIndex++, "..",
        GetLocalIconIndex(NULL, FILE_ATTRIBUTE_DIRECTORY)), 1);

    // i 爲 0 時列目錄,i 爲 1時列文件
    for (int i = 0; i < 2; i++)
    {
        CFileFind FindFile;
        BOOL bContinue;
        bContinue = FindFile.FindFile(m_Local_File_Path + "*.*");   // 文件搜索
        while (bContinue)
        {
            bContinue = FindFile.FindNextFile();        // 查找下一個
            if (FindFile.IsDots())                  // 是 '.'
                continue;
            BOOL bIsInsert = !FindFile.IsDirectory() == i;      // 判斷是否爲目錄
            if (!bIsInsert)
                continue;

            int iItem = m_local_list.InsertItem(iItemIndex, FindFile.GetFileName(), 
                GetLocalIconIndex(FindFile.GetFileName(), GetFileAttributes(FindFile.GetFilePath())));
            m_local_list.SetItemData(iItem, FindFile.IsDirectory());

            // 獲取文件/文件夾信息
            SHFILEINFO sfi;
            SHGetFileInfo(FindFile.GetFileName(), FILE_ATTRIBUTE_NORMAL, &sfi,sizeof(SHFILEINFO), 
                SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);

            if (FindFile.IsDirectory()) {
                m_local_list.SetItemText(iItem, 2, "文件夾");
            }
            else {
                m_local_list.SetItemText(iItem, 2, sfi.szTypeName);
            }

            // 插入文件/文件夾的大小
            CString strFileLength;
            strFileLength.Format("%10d KB", (FindFile.GetLength() / 1024));
            m_local_list.SetItemText(iItem, 1, strFileLength);

            // 插入文件/文件夾的修改時間
            CTime time;
            FindFile.GetLastWriteTime(time);
            m_local_list.SetItemText(iItem, 3, time.Format("%Y-%m-%d %H:%M"));

        }

    }
}

上面的代碼有點多,不過我在這裏已經做了大量註釋了,相信不會太難看得懂的。

3、我們來到上節講的雙擊函數中將MessageBox()函數註釋掉,並添加FixedLocalFileList();,具體如下:

VOID CLocalFileSysDlg::OnNMDblclkListLocal(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    // TODO: 在此添加控件通知處理程序代碼

    if (m_local_list.GetSelectedCount() == 0 || 
        m_local_list.GetItemData(m_local_list.GetSelectionMark()) != 1)
        return;

    // MessageBox("雙擊了");

    FixedLocalFileList();

    *pResult = 0;
}

添加完上面代碼我們此時既可以通過雙擊進入到下一級目錄了,效果圖如下:
這裏寫圖片描述

到這裏我們已經可以進入到文件夾內部了,如果後續還需要增加對文件夾/文件的增、刪、重命名、打開等操作的話,可以給我留言,有時間的話我會繼續在博客中完善這些功能的。

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