磁盘文件目录罗列和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,到此!
拙见,小记!
相关文章:
潘石屹Python考试成绩99分,网友:还有一分怕你骄傲
整理 | 伍杏玲题图 | 视觉中国来源 | 程序人生(ID:coder_life)5月16日凌晨00:21分,地产大亨潘石屹在微博晒出自己的Python编程一级考试成绩,99分,厉害!像每个学生时期的我们,还会“检…

让Chrome成为你的pdf阅读器
我在Mac OS上使用过的浏览器有Chrome、Safari和Firefox,由于做的产品要支持多浏览器,所以这几种浏览器都会用到,Chrome的使用频率更高一些。 之前想通过浏览器在线阅读PDF时,一般都会提示进行下载,装了类似iGetter或Fo…

l5如何通过路由走api版本回退查找设置
l5如何通过路由走api版本回退查找设置 具体需求 当前遇到的问题是使用laravel写接口,但是接口是有版本号的,我们把版本号放在url中,比如: http://yejianfeng.com/api/user/info/?uid1 http://yejianfeng.com/api1.1/user/info/?…

jspf插件框架
简介:jspf (Java Simple Plugin Framework) 是一个插件框架,用于减少小型项目的的开发时间,增加代码的可维护性。他完全隐藏了组件的详细实现,只用到他们的接口。加载组件所需要的代码也很少,便于编写。jspf框架完全基…

list控件响应鼠标键的单双击
前面一片博客磁盘文件目录罗列和list控件的使用 写过关于list控件的一点使用方法。这篇博客接着继续讲list控件,当我把某个磁盘下的文件目录列出来显示在list控件中,我们肯定是想要对这些目录进行一些操作,比如新建文件夹、删除文件等操作。那…
我佛了!用KNN实现验证码识别,又 Get 到一招!
作者| 李秋键责编| Carol出品| AI科技大本营(ID:rgznai100)头图 | CSDN付费下载自视觉中国验证码使我们生活中最为常见的防治爬虫和机器人登录攻击的手段,一般的验证码主要由数字和字母组成,故我们可以设想:…

JVM中的垃圾收集器
2019独角兽企业重金招聘Python工程师标准>>> Serial收集器: 一种新生代的单线程收集器,采用复制算法回收。当它进行垃圾收集时,其他用户的所有线程都将暂停。 Serial Old收集器:Serial的老年代版本,采用的是标记-清除算…

linux系统用户,组和权限的管理
PS: {最近一直在做毕业设计,前面博客也记录过我的一些过程。其中需要在Ubuntu上搭建一个FTP服务器,此处我选择Vsftpd,但是在我对vsftpd的配置文件vsftpd.conf设置正确后(对于上传,下载等设置肯定没问题&am…
520 情人节 :属于Python 程序员的脱单攻略大合集(视频版)
作者| Python 编程时光责编| Carol情人节年年有,但今年的 5.20 要比以往的更有意义。2020.05.20 ,爱你爱你我爱你,如果再卡个时间(13:14),那就是 爱你爱你我爱你一生一世。为了能过上这个这个百年难遇的情人…

使用Word2010灵活掌握文档结构
使用Microsoft Word应用程序组织和编写文档时,可能会出现反复调整文档结构的情况,而通过一系列的剪切、复制、粘贴操作来解决问题,可能会让您觉得很麻烦,有没有更好的解决办法呢?其实,通过使用Word 2010中全…

深入Jetty源码之HTTP协议
在计算机网络中,如果两台机器要通信,他们首先要定义通信数据的格式,这样在服务器收到客户端的请求消息时,它才能正确的解析请求的内容,然后根据请求内容处理逻辑,并将相应消息传递会客户端;此时…
64位win7安装vs2010出现“组件安装失败...”等问题的解决方法
如题,公司发了新电脑,安装的是64位win7 ,我原来的本本安装的是32位的win7,当时安装vs2010的时候并没有那么多事,这次安装却真是让我蛋疼至极。 先后下了3个vs的安装包,中文版的,有专业版的,有旗…

不同网段路由配置
PC1 ip 192.168.1.1PC2 ip 192.168.4.1路由0 f0/0 192.168.1.254 f0/1 192.168.2.1路由1 f0/0 192.168.3.1f0/1 192.168.2.2路由2 f0/0 192.168.4.254 f0/1 192.168.3.2路由器0Router>enRouter#conf tRouter(config)#no ip domain-lookupRouter(config)#line console 0…
黑科技:绕过眼睛植入幻觉,科学家成功在盲人脑海中呈现指定图像!
来源 | 学术头条(ID:SciTouTiao)头图 | CSDN付费下载自视觉中国对于全球 5000 多万盲人来说,重见光明是一个遥不可及的梦想。而为了与盲人朋友进行交互,我们发明了盲文,用各种凸起的字符集合来表达各种意思。但这种通过…

Solr 4.x定时、实时增量索引 - 修改、删除和新增索引
2019独角兽企业重金招聘Python工程师标准>>> 一、开始增量索引前的准备工作。 1、认识data-config.xml中相关属性 <!-- transformer 格式转化:HTMLStripTransforme表示 索引中将忽略HTML标签 ---> <!-- query: 查询数据库表符合记录数据 …

关于Blocking IO, Non-Blocking IO 和 Asynchronous I/O的理解
文章写得很详细很清楚了,对我的理解帮助很大。 转载自:http://www.cnblogs.com/whyandinside/archive/2012/03/04/2379234.html。 概括来说,一个IO操作可以分为两个部分:发出请求、结果完成。如果从发出请求到结果返回ÿ…
还在苦恼机器学习和线性回归?这篇总结拿走不谢 | 原力计划
作者 | 听星的朗瑞责编 | 王晓曼出品 | CSDN博客题图 | 东方IC什么是机器学习?机器学习是一种实现人工智能的方法,从数据中寻找规律、建立关系,根据建立的关系去解决问题,从数据中进行经验学习,实现自我优化与升级。维…

网页设计和用户界面设计
摘要:这是两个现在网页设计领域使用频率非常高的词。在大多数情况下,它们被相互替代。这个领域内外的很多人都认为这是两个意义基本一样的词。但是它们真的可以互相混淆么?这是两个现在网页设计领域使用频率非常高的词。在大多数情况下&#…

使用VisualStudio2010连接CodePlex进行代码管理
摘要:CodePlex是微软的开源工程网站,涉及诸多微软最新技术的开源工程,同时你也可以建立并向世界展示自己的开源工程。同SourceForge、GoogleCode相比CodePlex有其自身的优势,特别是对做.Net开发的朋友来说,由于CodePle…

计算程序运行时间(time_t, clock_t)
转载自:http://blog.chinaunix.net/uid-23208702-id-75182.html 计算程序运行时间(time_t, clock_t)-whyliyi-ChinaUnix博客 我们有时需要得到程序的运行时间,但我们也要知道,根本不可能精确测量某一个程序运行的确切…
又一年5.20,用Python助力程序员脱单大攻略(视频版)
作者 | 写代码的明哥来源 | Python编程时光(ID: Cool-Python)情人节年年有,但今年的 5.20 要比以往的更有意义。2020.05.20 ,爱你爱你我爱你,如果再卡个时间(13:14),那就是 爱你爱你…

pthred()多线程计算派
实验一:计算π问题描述实验提供了两种计算方法,一种使用积分方法,另一种采用随机数方法。本报告中采用积分方法。计算公式:程序流程图:(图1)函数流程图(图2)一组实验数据,计算规模:500,000,000性…

使用最小堆优化Dijkstra算法
OJ5.2很简单,使用priority_queue实现了最小堆竟然都过了OJ……每次遇到relax的问题时都简单粗暴地重新push进一个节点…… 然而正确的实现应该是下面这样的吧,关键在于swap堆中元素时使用pos数组存储改变位置后的编号为k的节点对应在堆中的位置。下面这种…

C语言编程技巧-signal(信号机制)
http://blog.sina.com.cn/s/blog_6a1837e90100v1vc.html

第一课:网络参考模型OSI
网络参考模型OSI(一):模型提出目的:开放系统互连。使各个厂商的设备可以很好的互连、互通、互操作。(二):各层功能(1):物理层:负责链路上bit流的传输。(bit流显著的特点是,不支持格式或者结构)。…
在线直播 | 是事实还是贩卖焦虑?IT行业也偏爱“小鲜肉”
几年前曾看过这样一篇报道:Java 之父求职被嫌年纪大,硅谷公司现在喜欢“小鲜肉”,不爱“老古董”。Java之父 James Gosling 在 Facebook 上发表了他所遭遇的年龄歧视:我曾在面试的时候被 HR 告知,“通常我们不招你这种…

eclipse 代码中突然出现特殊字符
在写代码的时候,不知道点到了 eclipse 的哪个属性,代码中就出现了一些特殊字符,也不能删除。 请问,在 eclipse 中该怎么设置,才能将这些字符去掉。 如下图所示: 解决方法: 选择Window->Preferences->…

如何优化数据中心虚拟机布局
当前已经有很多组织将服务器虚拟化技术引入到生产中,这么做是有道理的,特别是在当前经济并不景气的情况下,因为服务器虚拟化技术可以在服务器硬件,机架空间,电力消耗和制冷方面为组织节省开支。 但为了实现服务器虚…

回归——同步更新github.io
回归 已经有好长时间没写博客了,可能我比较懒,不太乐于分享,我觉得这个是一个很不好的习惯。但我坚信:Sharing changes the world! 最近搭建了自己的个人独立博客,基于Github Pages的,所以打算以后同步更…
支持量子机器学习,王海峰发布最新百度飞桨全景图
出品 | AI科技大本营(ID:rgznai100)刚刚,WAVE SUMMIT 2020深度学习开发者峰会上,百度CTO王海峰开场即披露了一组飞桨数据:飞桨累计开发者数量已超过190万,服务企业数量达8.4万家,发布模型数量已…