在C#系统应用毕设U盘防御软件中需要实现文件不可恢复的删除,
首先需要实现类似于资源管理器的界面,
通过TreeView控件显示"我的电脑"所有磁盘文件树状目录并加载相应图标.
显示结果如下图所示:
一. 界面设计
主窗体是一个Windowss窗体文件,工程命名为SecureTree.
分别从工具箱中左边拖一个TreeView控件,名称(Name)为directoryTree;
右侧文件列表ListView控件,名称为filesList.
然后从工具箱中拖两个ImageList控件,
分别命名为directoryIcons和filesIcons.右键directoryIcons点击"选择图像",
从本地Resource文件夹中添加图片如下图所示5张图片,同理filesIcons添加Closed Folder.ico图标.
添加完成后,
指定directoryTree控件的ImageList属性为directoryIcons,
filesList控件的SmallImageList属性为filesIcons绑定图标.
二. 代码实现
1.添加IconIndexes枚举类型类,这个枚举类型值与之前添加到directoryIcons图标对应.这样TreeView控件便可显示该结点相对应的图标.
2.添加响应主窗体的Load事件,在窗体加载后,获取最顶层电脑驱动器和我的文档信息并加载到TreeView控件中.并添加命名空间:using System.IO;
3.添加TreeView的AfterExpand事件和BeforeExpand事件.
分别是展开结点后实现展开,将要展开前实现加载子目录结点.选择文件夹时会显示不同icon图标.
注意事项:
(1).该项目中"我的电脑"是作者自定义的root节点,没有设定其路径,所以BeforeExpand事件中会从它开始依次遍历,但"我的电脑"会提示"没有指定路径".故需要if(e.Tag.ToString() != "我的电脑")判断.同时"我的文档"需要再次获取其路径,依次实现Add子节点;
(2).同时在"我的文档"和盘符中需要添加tNode.Nodes.Add("")加载空节点形成+号,如果没有该+号,BeforeExpend事件不会被调用,子目录无法获取加载,在BeforeExpand事件调用TreeViewItems.Add加载其子结点需要e.Nodes.Clear();清除该结点的子目录再加载.
(3).提供两篇类似文章供大家学习,经过对比可以发现:第一篇仅从驱动器(C盘)开始加载,所以BeforeExpend简单展开子目录即可,不需要判断"我的电脑"和"我的文档".第二篇含"桌面",因此需要判断路径:"C# TreeView磁盘文件,AfterSelect显示加号-骆驼祥子" 和"Treeview树状显示文件夹" .同时补充一篇很优秀的文章供大家学习"WinForm应用:ListView做图像浏览"
(4).补充TreeView(树视图)事件:更详细见"c# 树状视图(TreeView类)".
事件 | 描述 |
AfterCheck | 在选中节点复选框后引发 |
AfterCollapse | 在折叠一个节点后引发 |
AfterExpand | 在扩展一个节点后引发 |
AfterSelect | 在选中一个节点后引发 |
BeforeCheck | 在选中节点复选框之前引发 |
BeforeCollapse | 在折叠一个节点之前引发 |
BeforeExpand | 在扩展一个节点之前引发 |
BeforeSelect | 在选中一个节点之前引发 |
(5).补充两个关于论坛讨论"c#怎样动态读取资源文件里的图片"和"在C#中怎么调用Resources文件中的图片"
(6).在《C#典型模块与项目实战大全》(清华大学出版社-丁士锋)书中谈到,出于对程序响应性能考虑,它先加载盘符结点,没有使用递归一次性加载所有文件到树状列表中,代码通过AfterSelect事件和FileSystemWatcher控件,监听加载.并使用线程池Task更新加载TreeView,希望大家去学习.
三. 总结
该篇通过TreeView加载了磁盘目录路径,并通过ImageList加载图标.那么怎样实现阅读文件夹下文件,获取其图标、文件大小、扩展名等信息,并双击打开文件呢?下一篇将接着讲述.最后希望该文章对大家有所帮助,文章中很多链接都可以供觉得有用的同学学习,感谢上面提到的文章及书籍作者.同时如果文章中有错误或不足之处请原谅,有问题或建议者亦可提出.希望尊重作者劳动果实勿喷.
原文:http://blog.csdn.net/eastmount/article/details/19453107
资源下载地址:http://download.csdn.net/detail/eastmount/6937355
想使用C++ MFC实现同样功能的文章见:http://blog.csdn.net/eastmount/article/details/19120567
(By:Eastmount 2014-2-19 下午3点http://blog.csdn.net/eastmount/)