日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

磁盘文件目录罗列和list控件的使用

發布時間:2023/11/27 生活经验 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 磁盘文件目录罗列和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控件的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。