資源管理器(一)

y_0002.gif資源管理器的作用是,對計算機上的文件資源進行管理,對各種文件進行相應的需要操作。這裏用C#實現了一個簡單的資源管理器,可以講所有文件和目錄以樹的形式顯示在容器左側,而容器右側的是選擇的某個文件或目錄的屬性,在右側,我們科以通過雙擊文件來打開文件。主要熟悉對樹的一些操作和對文件的操作。

public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }
       /// <summary>
       /// 瀏覽按鈕的作用。提示用戶選擇要展示的路徑然後經過判斷用戶的選擇來確定後面的進程
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
       private void btnBrowser_Click(object sender, EventArgs e)
       {
           FolderBrowserDialog fbd = new FolderBrowserDialog();
           DialogResult dr = fbd.ShowDialog();
           if (dr == DialogResult.Cancel)
           {
               return;
           }
           string path = fbd.SelectedPath;
           this.txtPath.Text = path;
           //將用戶選擇的目錄以樹的形式展示在TreeView中
           FillTreeView(path);
       }
       //填充樹
       private void FillTreeView(string path)
       {
           //將最頂層的目錄名添加到根節點
           DirectoryInfo di = new DirectoryInfo(path);
           TreeNode node = new TreeNode();
           node.Text = di.Name;
           node.Tag = di;//注意要去node的Tag屬性並將di給這個屬性
           this.tvViewLeft.Nodes.Add(node);
           //給di這個目錄下添加子節點
           AddChildNodes(node, di);
       }
       //爲當前的目錄添加子節點
       private void AddChildNodes(TreeNode node, DirectoryInfo di)
       {
           foreach (DirectoryInfo temp in di.GetDirectories())
           {
               TreeNode tempNode = new TreeNode();//創建一個節點
               tempNode.Text = temp.Name;//將當前目錄名作爲子節點的名字
               tempNode.Tag = temp;
               node.Nodes.Add(tempNode);//添加一級子節點
               //這一步的嵌套調用,就可以實現爲根目錄下的一個子目錄添加完所有的節點(包括子節點和孫子節點)
               AddChildNodes(tempNode, temp);//給當前的節點(子節點)添加子節點(二級子節點)
           }
       }
       private void tvViewLeft_AfterSelect(object sender, TreeViewEventArgs e)
       {
           //判斷是否有選中的節點,如果有就用該節點(文件或目錄)的屬性填充右邊的ListView下的項
           if (this.tvViewLeft.SelectedNode==null)
           {
               return ;
           }
           FillListView(this.tvViewLeft.SelectedNode.Tag as DirectoryInfo);
       }
       private void FillListView(DirectoryInfo di)
       {
           this.listViewRight.Items.Clear();//每次填充之前都將原來的數據清空
           foreach (DirectoryInfo temp in di.GetDirectories())
           {
               ListViewItem lvi = new ListViewItem();
               lvi.Text = temp.Name;//目錄名
               lvi.SubItems.Add(temp.LastWriteTime.ToString());//大小
               lvi.SubItems.Add("文件夾");//文件類型
               lvi.SubItems.Add("");
               lvi.Tag = temp;//取得Tag屬性
               this.listViewRight.Items.Add(lvi);
           }
           foreach (FileInfo temp in di.GetFiles())
           {
               ListViewItem lvi = new ListViewItem();
               lvi.Text = temp.Extension;//目錄名
               lvi.SubItems.Add(temp.LastWriteTime.ToString());
               lvi.SubItems.Add("文件夾");//文件類型
               lvi.SubItems.Add(temp.Length.ToString());//大小
               lvi.Tag = temp;
               this.listViewRight.Items.Add(lvi);
           }
       }
       /// <summary>
       /// 處理雙擊事件
       /// </summary>
       /// <param name="sender">觸發雙擊事件的控件</param>
       /// <param name="e"></param>
       private void listViewRight_DoubleClick(object sender, EventArgs e)
       {
           //如果沒有選中的項就返回
           if (this.listViewRight.SelectedItems.Count==0)
           {
               return;
           }
           //如果選中項是目錄,就調用FillListView方法用該目錄下的子目錄和文件來填充ListView下的項
           if (this.listViewRight.SelectedItems[0].Tag is DirectoryInfo)
           {
               FillListView(this.listViewRight.SelectedItems[0].Tag as DirectoryInfo);
           }
           //如果選中的是文件,就打開文件
           else
           {
               Process.Start((this.listViewRight.SelectedItems[0].Tag as FileInfo).FullName);
           }
       }
   }

後面再一一實現其他的各種操作。共同期待早日完成!。。。

看看結果:110334396.png

P.S:這裏需要注意的是在添加節點的時候this.tvViewLeft.Nodes.Add(node);這裏面的Nodes集合是所有根節點的集合。而node.Nodes.Add(tempNode);裏面的Nodes集合是某個根節點下的所有一級子節點的集合。這裏需要注意一下。

這裏還用到了“容器”這個概念。這裏用到的是SplitContainer容器,分爲左右兩部分,可以再屬性那裏設置這兩部分的最小值。(PanelMinsize處設置)


j_0047.gif Ajax的姑娘,加油!j_0047.gif

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章