开发类似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控件的使用相关推荐

  1. list控件响应鼠标键的单双击

    前面一片博客磁盘文件目录罗列和list控件的使用 写过关于list控件的一点使用方法.这篇博客接着继续讲list控件,当我把某个磁盘下的文件目录列出来显示在list控件中,我们肯定是想要对这些目录进行 ...

  2. Winform UI界面设计例程——TreeView控件

    今天我们来探讨下treeView的使用 treeView控件是树形菜单,非常易于展示层次结构和对其进行导航,我们电脑的资源管理器就是使用了treeView控件进行目录和磁盘的导航. TreeView控 ...

  3. Delphi 控件开发步骤

    delphi 控件开发步骤 Delphi控件开发步骤 1.使用Delphi IDE的 Component -> New Component 菜单 2.按照向导逐步完成 3.控件工程文件 4.控件 ...

  4. C# 系统应用之TreeView控件 (一).显示树状磁盘文件目录及加载图标

    在C#系统应用毕设U盘防御软件中需要实现文件不可恢复的删除,首先需要实现类似于资源管理器的界面,通过TreeView控件显示"我的电脑"所有磁盘文件树状目录并加载相应图标.显示结果 ...

  5. C# 系统应用之ListView控件 (三).添加ContextMenuStrip右键菜单打开删除文件

    在前面讲述过使用TreeView控件和ListView控件显示磁盘目录信息,但仅仅是显示信息是不够的,我们还需要具体的操作.在"个人电脑使用历史痕迹"项目中我还需要添加" ...

  6. C# 系统应用之ListView控件 (二).加载选中节点文件夹下文件信息

    在项目中的前面一篇文章"C# 系统应用之TreeView控件 (一).显示树状磁盘文件目录及加载图标"中我讲述了如何使用TreeView控件树状实现显示"我的电脑&quo ...

  7. ASP.NET中制作WEB统计图控件的捷径

    一.    引言 在许多B/S结构的信息管理软件中,利用在线统计图帮助用户观察.分析各种各样的数据,要比纯粹依靠统计表格更直观,更形象.然而,与窗体类程序相比,在WEB中实现统计图功能存在着一些差别, ...

  8. Scripting.FileSystemObject控件的用法

    文件系统对象FSO的英文全称是File System Object ,这种对象模型提出了有别于传统的文件操作语句处理文件和文件夹的方法.通过采用object.method这种在面向对象编程中广泛使用的 ...

  9. Unity编辑器扩展 UI控件篇

    前摇 :认识编辑器扩展的必要性 由于各种各样的原因,无论是移动端亦或是主机/PC端,进几年的发行的游戏体量是越来越大.通常来说大体量的游戏开发需要一套很成熟完善的工作流,亦或说有很强的工业化的能力,像 ...

最新文章

  1. 比赛杀器LightGBM常用操作总结!
  2. CSS布局——横向两列布局
  3. 途虎养车APP--参数分析
  4. android linux内核开发环境,定制Android 4.2.2开发环境
  5. Docker JFrog Artifactory 7.27.10 maven私服(IDEA 实战篇01) linux
  6. linux下openssh5.3漏洞,linux的低版本中openssh三大漏洞的分析及修复方法
  7. 计算机多系统启动光盘制作,制作启动光盘,小编教你如何制作光盘启动盘
  8. 裁员的沃森健康,问题重重的IBM人工智能业务
  9. 【科研】科研绘图作图画图
  10. 姜烧猪肉+日式厚蛋烧+蚝油青笋
  11. 女人需要调教人需要调教
  12. 疫情下的情人节 餐饮业再亏700亿!
  13. 冀州中学高考2021成绩查询,冀州中学2019高考喜报成绩、本一上线人数情况(
  14. java里面的语法糖(糖衣语法)
  15. (三十八)期权定价的蒙特卡洛模拟方法
  16. 如何让思路更清晰?simplemind for Mac思维导图来帮忙
  17. 肖 清华计算机系 北大生命科学,7个清华北大,11+复旦交大,后续还有一大波浙大……他们都是同班同学!...
  18. 多重背包问题的二进制优化(C语言)
  19. C#连接Access数据库
  20. python opencv 条形码及二维码检测识别

热门文章

  1. io获取 pcl_点云数据可视化之PCL滤波学习
  2. 移动应用开发的六大编程语言
  3. Python+OpenCV图像处理实验
  4. 小R SLAM机器人基本命令
  5. php会员中心模板,会员中心模板
  6. 现代计算机三大科学计算,计算机的三大特点是什么?
  7. 使用Vant框架的组件van-pull-refresh搭配van-list和van-card完成上滑加载更多列表数据,下拉刷新当前列表数据(等同于翻页功能)
  8. 在Ubuntu 14.04 64bit上安装Markdown编辑器Remarkble
  9. 学习用C#在Unity中创建一个2D Metroidvania游戏
  10. 怎么编写段错误(Segmentation fault)的程序