磁盘文件目录罗列和list控件的使用
開發類似ftp客戶端的這種軟件,需要對每個磁盤下的文件目錄進行羅列并顯示。方便文件的上傳、下載等。就如同我們打開每個磁盤所顯示的那樣,羅列了你這個磁盤目錄下的所有文件夾和文件。
那我們在自己的程序中如何做到這樣呢?
主要用到兩個方面的知識:CFileFind和list control的使用。關于這兩方面的知識,不是我此篇博文的目的,況且我就是一個菜鳥,我只是貼兩篇詳細講這個的博文。Vc控件用法總結之List Control; MFC中ListControl控件的使用 ;CFileFind類學習 .
那么接下來開始操作:
1、首先我們肯定是要在對話框中的某個位置拖放一個List控件,并關聯變量CListCtrl m_listlocal。
2、我們需要給list添加列(比如三列,分別是文件名,日期,字節數)
我們可以在OninitDialog()函數中實現。
//獲得控件擴展屬性DWORD dwStyle = m_listlocal.GetExtendedStyle();//選中某行使整行高亮(只適用與report風格的listctrl)dwStyle |= LVS_EX_FULLROWSELECT;//網格線(只適用與report風格的listctrl)dwStyle |= LVS_EX_GRIDLINES; //設置控件擴展屬性 m_listlocal.SetExtendedStyle(dwStyle); m_listlocal.InsertColumn(0, "文件名",LVCFMT_LEFT,100);m_listlocal.InsertColumn(1,"日期",LVCFMT_LEFT,100);m_listlocal.InsertColumn(2,"字節數",LVCFMT_LEFT,100);
3、完成第2步之后運行就會發現list控件具有三列了,分別是文件名,日期,字節數。那么關鍵的一步來了,如何羅列給定磁盤的文件目錄呢?
直接上代碼:
void CFTPCilentDlg::locallistdir(CString strdir) //列出文件目錄
{
//strdir表示C:、D:、E:...CFileFind finddlg; CString szdir=strdir;CString strname;CString strtime;ULONGLONG byte;CString strbyte;CTime refTime;int i=0;SHFILEINFO finfo;CListCtrl* plst_ctl=(CListCtrl*)GetDlgItem(IDC_LISTlocal);//IDC_LIST1為CListCtrl控件的ID//添加圖標(將圖標存放在CImageList對象中,并與CListCrtl控件相關聯)//m_imagelist_b.Create(32,32,ILC_COLOR32|ILC_MASK ,0,0);//大圖標m_imagelist_s=new CImageList();m_imagelist_s->Create(16,16,ILC_COLOR32|ILC_MASK ,0,0);//小圖標//plst_ctl->SetImageList(&m_imagelist_b,LVSIL_NORMAL);//大圖標plst_ctl->SetImageList(m_imagelist_s,LVSIL_SMALL);if(szdir.Right(1)!= "\\") szdir+= "\\"; //千萬注意此處不能有空格,媽的,廢了老子2個小時來調試szdir+= "*.*"; //同上,同上,同上BOOL res=finddlg.FindFile(szdir); while(res) { res=finddlg.FindNextFile(); if(finddlg.IsDots()) //找到.文件 {//MessageBox("zhaodaole");strname.Format("%s",finddlg.GetFileName());if (strname.Compare("..")==0) //找到上層目錄{//獲取文件信息,主要圖標iconSHGetFileInfo(finddlg.GetFilePath(),0,&finfo,sizeof(finfo),SHGFI_ICON );//添加文件項目和圖標//m_imagelist_b.Add(finfo.hIcon);//向ImageList里添加圖標資源int m=plst_ctl->InsertItem(0,finddlg.GetFileName(), m_imagelist_s->Add(finfo.hIcon));//空出第一行}}else if(finddlg.IsDirectory()&&!finddlg.IsDots()) //找到目錄(文件夾)并且不是隱藏文件....xxx{ //locallistdir(finddlg.GetFilePath()); strname.Format("%s",finddlg.GetFileName());if (finddlg.GetLastAccessTime(refTime)){strtime=refTime.Format("%d/%m/%y");}// int m=m_listlocal.InsertItem(i,strname); 這句和下面的plst_ctl->InsertItem(i,finddlg.GetFileName(...重復了//獲取文件信息,主要圖標iconSHGetFileInfo(finddlg.GetFilePath(),0,&finfo,sizeof(finfo),SHGFI_ICON );//添加文件項目和圖標//m_imagelist_b.Add(finfo.hIcon);//向ImageList里添加圖標資源int m=plst_ctl->InsertItem(1,finddlg.GetFileName(), m_imagelist_s->Add(finfo.hIcon)); m_listlocal.SetItemText(m,1,strtime);m_listlocal.SetItemText(m,2,_T("*")); } else //!finddlg.IsDirectory()&&!finddlg.IsDots() //不是目錄也不是隱藏文件,即找到文件{strname.Format("%s",finddlg.GetFileName());if (finddlg.GetLastAccessTime(refTime)){strtime=refTime.Format("%d/%m/%y");}byte=finddlg.GetLength(); //此處要注意溢出,害慘我了byte/=1024;float MByte=(float)byte/1024;if (MByte>=1.0){char *s=new char[256];memset(s,0,256);sprintf(s,"%.1f",MByte);strbyte.Format(_T("%s"),s);strbyte+="MB";delete s;}else{strbyte.Format(_T("%d"),byte); //還有此處的類型轉換,不能用%s,而要用%d.strbyte+="KB";}// int m=m_listlocal.InsertItem(i,strname);//獲取文件信息,主要圖標iconSHGetFileInfo(finddlg.GetFilePath(),0,&finfo,sizeof(finfo),SHGFI_ICON );//添加文件項目和圖標//m_imagelist_b.Add(finfo.hIcon);//向ImageList里添加圖標資源int m=plst_ctl->InsertItem(1,finddlg.GetFileName(), m_imagelist_s->Add(finfo.hIcon));m_listlocal.SetItemText(m,1,strtime);m_listlocal.SetItemText(m,2,strbyte); }} finddlg.Close();}
由于我是直接從我的工程當中復制了代碼,所以有些語句跟這篇博文的主題并無關系,如果需要使用,需要刪除一些語句。
那么我簡要介紹一下代碼:核心代碼在while()循環里邊,通過函數IsDots()和IsDirectory()對文件類型進行判斷,找到一個文件,再接著找下一個文件,FindNextFile()和FindFile()兩個函數進行查找,如果找到,則返回值非零,否則為零。其實查找的過程很簡單,代碼也很容易理解。具體涉及到對list控件的操作是這幾行代碼:
int m=plst_ctl->InsertItem(1,finddlg.GetFileName(), m_imagelist_s->Add(finfo.hIcon)); m_listlocal.SetItemText(m,1,strtime); m_listlocal.SetItemText(m,2,_T("*"));
其中有幾行代碼是:
CListCtrl* plst_ctl=(CListCtrl*)GetDlgItem(IDC_LISTlocal);//IDC_LIST1為CListCtrl控件的ID//添加圖標(將圖標存放在CImageList對象中,并與CListCrtl控件相關聯)//m_imagelist_b.Create(32,32,ILC_COLOR32|ILC_MASK ,0,0);//大圖標m_imagelist_s=new CImageList();m_imagelist_s->Create(16,16,ILC_COLOR32|ILC_MASK ,0,0);//小圖標//plst_ctl->SetImageList(&m_imagelist_b,LVSIL_NORMAL);//大圖標plst_ctl->SetImageList(m_imagelist_s,LVSIL_SMALL);
主要的功能是獲取文件目錄的圖標,然后添加在List控件的第一列中,方便我們認識這個文件的類型。具體用法,我就不班門弄斧了,大家自行百度。
好了,基本的用法就如上所示,可以實現下圖的樣子:
關于list控件的其他使用,比如響應鼠標左鍵單擊,右鍵單擊等,我在后邊的博客會簡要記錄一下。
ok,到此!
拙見,小記!
總結
以上是生活随笔為你收集整理的磁盘文件目录罗列和list控件的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MFC系统托盘的实现
- 下一篇: list控件响应鼠标键的单双击