磁盤空間緊張,需要移除不需要的文件,但我不知道要?jiǎng)h除多少個(gè)文件才能騰出足夠的空間。有時(shí),刪除了一堆的小文件,還是不夠。此資源包容一個(gè)VS2012項(xiàng)目FindAllHudgeFiles源碼,在bin文件夾下可以得到可運(yùn)行的exe文件。本程序使用C#和WPF開發(fā),用途為查找指定文件夾下的大文件。
這一工具雖小,但用到的技術(shù)可不少。由于充分地應(yīng)用了現(xiàn)成的技術(shù)與組件,比如DataGrid本身就己經(jīng)有很強(qiáng)大的功能,使得整個(gè)程序代碼量不大,界面友好性也不錯(cuò)。如果采用Java開發(fā),工作量要大不少,最關(guān)鍵的是Java桌面應(yīng)用性能夠嗆;如果用C++開發(fā)非托管版本,問(wèn)題是開發(fā)效率太低,即使這樣一個(gè)小程序,恐怕也得花不少時(shí)間(可能得一星期)才能實(shí)現(xiàn)C#版本的所有功能,不過(guò)C++版本會(huì)擁有一個(gè)好處,所有Windows下均可運(yùn)行,并不需要安裝.NET。
解決方案:
與其刪除一堆的“小文件”,不如只關(guān)注“大文件”。為此,可以寫一個(gè)小工具,搜索指定文件夾下的所有大于指定大小的文件。
技術(shù)選型:
本程序采用WPF開發(fā),基于.NET 4.0。項(xiàng)目格式:Visual Studio 2012,開發(fā)語(yǔ)言:C#,如果使用Visual studio 2010,請(qǐng)自行創(chuàng)建一個(gè)WPF項(xiàng)目,將源碼移入即可編譯。
運(yùn)行環(huán)境:
安裝了.NET Framework 4.0的Windows計(jì)算機(jī)。在Windows 7 64位旗艦版下測(cè)試通過(guò)。
界面設(shè)計(jì):
按照人們?cè)谡业轿募笞钚枰墓δ,設(shè)計(jì)程序界面如下:
中間的文件列表采用DataGrid控件,其它的都是簡(jiǎn)單的WPF控件,總體布局使用DockPanel,支持界面大小的動(dòng)態(tài)調(diào)整。
編程技術(shù)關(guān)鍵點(diǎn):
(1)搜索功能采用.NET 4.0所提供的PLINQ完成,使用線程統(tǒng)一取消模型取消操作。
(2)由于搜索是在獨(dú)立的線程中完成的,因此,更新界面的工作用到了Dispatcher對(duì)象,將UI更新代碼推送到UI線程中執(zhí)行。
(3)在查找文件過(guò)程中,部分系統(tǒng)文件夾會(huì)因權(quán)限問(wèn)題而無(wú)法讀取文件,故需妥善處理UnauthorizedAccessException異常。
(4)找到文件后,需要將文件名顯示在列表中,為此設(shè)計(jì)了一個(gè)FoundFile類封裝這些信息。顯示工作利用了WPF強(qiáng)大的數(shù)據(jù)綁定機(jī)制。因此讓FoundFile類實(shí)現(xiàn)INotifyPropertyChanged接口,并且將FoundFile對(duì)象放到ObservableCollection泛型集合中,綁定到DataGrid。這里需要指出的是,發(fā)現(xiàn)WPF數(shù)據(jù)綁定支持跨線程更新DataGrid,從而大大地減少了代碼編寫量。
(5)找到的文件大小是字節(jié),為此,編寫一個(gè)NumberConverter類,將其轉(zhuǎn)換為常見的K,M、G等,設(shè)計(jì)WPF數(shù)據(jù)綁定機(jī)制使用它來(lái)進(jìn)行數(shù)值轉(zhuǎn)換(詳看DataGrid的綁定表達(dá)式)