磁盘空间紧张,需要移除不需要的文件,但我不知道要删除多少个文件才能腾出足够的空间。有时,删除了一堆的小文件,还是不够。此资源包容一个VS2012项目FindAllHudgeFiles源码,在bin文件夹下可以得到可运行的exe文件。本程序使用C#和WPF开发,用途为查找指定文件夹下的大文件。
这一工具虽小,但用到的技术可不少。由于充分地应用了现成的技术与组件,比如DataGrid本身就己经有很强大的功能,使得整个程序代码量不大,界面友好性也不错。如果采用Java开发,工作量要大不少,最关键的是Java桌面应用性能够呛;如果用C++开发非托管版本,问题是开发效率太低,即使这样一个小程序,恐怕也得花不少时间(可能得一星期)才能实现C#版本的所有功能,不过C++版本会拥有一个好处,所有Windows下均可运行,并不需要安装.NET。
解决方案:
与其删除一堆的“小文件”,不如只关注“大文件”。为此,可以写一个小工具,搜索指定文件夹下的所有大于指定大小的文件。
技术选型:
本程序采用WPF开发,基于.NET 4.0。项目格式:Visual Studio 2012,开发语言:C#,如果使用Visual studio 2010,请自行创建一个WPF项目,将源码移入即可编译。
运行环境:
安装了.NET Framework 4.0的Windows计算机。在Windows 7 64位旗舰版下测试通过。
界面设计:
按照人们在找到文件后最需要的功能,设计程序界面如下:
中间的文件列表采用DataGrid控件,其它的都是简单的WPF控件,总体布局使用DockPanel,支持界面大小的动态调整。
编程技术关键点:
(1)搜索功能采用.NET 4.0所提供的PLINQ完成,使用线程统一取消模型取消操作。
(2)由于搜索是在独立的线程中完成的,因此,更新界面的工作用到了Dispatcher对象,将UI更新代码推送到UI线程中执行。
(3)在查找文件过程中,部分系统文件夹会因权限问题而无法读取文件,故需妥善处理UnauthorizedAccessException异常。
(4)找到文件后,需要将文件名显示在列表中,为此设计了一个FoundFile类封装这些信息。显示工作利用了WPF强大的数据绑定机制。因此让FoundFile类实现INotifyPropertyChanged接口,并且将FoundFile对象放到ObservableCollection泛型集合中,绑定到DataGrid。这里需要指出的是,发现WPF数据绑定支持跨线程更新DataGrid,从而大大地减少了代码编写量。
(5)找到的文件大小是字节,为此,编写一个NumberConverter类,将其转换为常见的K,M、G等,设计WPF数据绑定机制使用它来进行数值转换(详看DataGrid的绑定表达式)