磁盘文件目录罗列和list控件的使用
開發(fā)類似ftp客戶端的這種軟件,需要對(duì)每個(gè)磁盤下的文件目錄進(jìn)行羅列并顯示。方便文件的上傳、下載等。就如同我們打開每個(gè)磁盤所顯示的那樣,羅列了你這個(gè)磁盤目錄下的所有文件夾和文件。
那我們?cè)谧约旱某绦蛑腥绾巫龅竭@樣呢?
主要用到兩個(gè)方面的知識(shí):CFileFind和list control的使用。關(guān)于這兩方面的知識(shí),不是我此篇博文的目的,況且我就是一個(gè)菜鳥,我只是貼兩篇詳細(xì)講這個(gè)的博文。Vc控件用法總結(jié)之List Control; MFC中ListControl控件的使用 ;CFileFind類學(xué)習(xí) .
那么接下來開始操作:
1、首先我們肯定是要在對(duì)話框中的某個(gè)位置拖放一個(gè)List控件,并關(guān)聯(lián)變量CListCtrl m_listlocal。
2、我們需要給list添加列(比如三列,分別是文件名,日期,字節(jié)數(shù))
我們可以在OninitDialog()函數(shù)中實(shí)現(xiàn)。
//獲得控件擴(kuò)展屬性DWORD dwStyle = m_listlocal.GetExtendedStyle();//選中某行使整行高亮(只適用與report風(fēng)格的listctrl)dwStyle |= LVS_EX_FULLROWSELECT;//網(wǎng)格線(只適用與report風(fēng)格的listctrl)dwStyle |= LVS_EX_GRIDLINES; //設(shè)置控件擴(kuò)展屬性 m_listlocal.SetExtendedStyle(dwStyle); m_listlocal.InsertColumn(0, "文件名",LVCFMT_LEFT,100);m_listlocal.InsertColumn(1,"日期",LVCFMT_LEFT,100);m_listlocal.InsertColumn(2,"字節(jié)數(shù)",LVCFMT_LEFT,100);
3、完成第2步之后運(yùn)行就會(huì)發(fā)現(xiàn)list控件具有三列了,分別是文件名,日期,字節(jié)數(shù)。那么關(guān)鍵的一步來了,如何羅列給定磁盤的文件目錄呢?
直接上代碼:
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//添加圖標(biāo)(將圖標(biāo)存放在CImageList對(duì)象中,并與CListCrtl控件相關(guān)聯(lián))//m_imagelist_b.Create(32,32,ILC_COLOR32|ILC_MASK ,0,0);//大圖標(biāo)m_imagelist_s=new CImageList();m_imagelist_s->Create(16,16,ILC_COLOR32|ILC_MASK ,0,0);//小圖標(biāo)//plst_ctl->SetImageList(&m_imagelist_b,LVSIL_NORMAL);//大圖標(biāo)plst_ctl->SetImageList(m_imagelist_s,LVSIL_SMALL);if(szdir.Right(1)!= "\\") szdir+= "\\"; //千萬注意此處不能有空格,媽的,廢了老子2個(gè)小時(shí)來調(diào)試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) //找到上層目錄{//獲取文件信息,主要圖標(biāo)iconSHGetFileInfo(finddlg.GetFilePath(),0,&finfo,sizeof(finfo),SHGFI_ICON );//添加文件項(xiàng)目和圖標(biāo)//m_imagelist_b.Add(finfo.hIcon);//向ImageList里添加圖標(biāo)資源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(...重復(fù)了//獲取文件信息,主要圖標(biāo)iconSHGetFileInfo(finddlg.GetFilePath(),0,&finfo,sizeof(finfo),SHGFI_ICON );//添加文件項(xiàng)目和圖標(biāo)//m_imagelist_b.Add(finfo.hIcon);//向ImageList里添加圖標(biāo)資源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); //還有此處的類型轉(zhuǎn)換,不能用%s,而要用%d.strbyte+="KB";}// int m=m_listlocal.InsertItem(i,strname);//獲取文件信息,主要圖標(biāo)iconSHGetFileInfo(finddlg.GetFilePath(),0,&finfo,sizeof(finfo),SHGFI_ICON );//添加文件項(xiàng)目和圖標(biāo)//m_imagelist_b.Add(finfo.hIcon);//向ImageList里添加圖標(biāo)資源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();}
由于我是直接從我的工程當(dāng)中復(fù)制了代碼,所以有些語句跟這篇博文的主題并無關(guān)系,如果需要使用,需要?jiǎng)h除一些語句。
那么我簡要介紹一下代碼:核心代碼在while()循環(huán)里邊,通過函數(shù)IsDots()和IsDirectory()對(duì)文件類型進(jìn)行判斷,找到一個(gè)文件,再接著找下一個(gè)文件,FindNextFile()和FindFile()兩個(gè)函數(shù)進(jìn)行查找,如果找到,則返回值非零,否則為零。其實(shí)查找的過程很簡單,代碼也很容易理解。具體涉及到對(duì)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//添加圖標(biāo)(將圖標(biāo)存放在CImageList對(duì)象中,并與CListCrtl控件相關(guān)聯(lián))//m_imagelist_b.Create(32,32,ILC_COLOR32|ILC_MASK ,0,0);//大圖標(biāo)m_imagelist_s=new CImageList();m_imagelist_s->Create(16,16,ILC_COLOR32|ILC_MASK ,0,0);//小圖標(biāo)//plst_ctl->SetImageList(&m_imagelist_b,LVSIL_NORMAL);//大圖標(biāo)plst_ctl->SetImageList(m_imagelist_s,LVSIL_SMALL);
主要的功能是獲取文件目錄的圖標(biāo),然后添加在List控件的第一列中,方便我們認(rèn)識(shí)這個(gè)文件的類型。具體用法,我就不班門弄斧了,大家自行百度。
好了,基本的用法就如上所示,可以實(shí)現(xiàn)下圖的樣子:
關(guān)于list控件的其他使用,比如響應(yīng)鼠標(biāo)左鍵單擊,右鍵單擊等,我在后邊的博客會(huì)簡要記錄一下。
ok,到此!
拙見,小記!
總結(jié)
以上是生活随笔為你收集整理的磁盘文件目录罗列和list控件的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MFC系统托盘的实现
- 下一篇: list控件响应鼠标键的单双击