在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/)