none
遍历系统目录添加到treeview节点 RRS feed

  • 问题

  • 功能需要:要求遍历当前目录下的子目录及文件,然后将目录下的子目录及文件添加到treeview节点上。
    性能要求:为了性能不采用全盘递归遍历。

    		private static string strpath="我的电脑";
    		private void MainForm_Load(object sender,EventArgs e)
    		{
    			TreeNode tNode=new TreeNode(strpath);
    			treeView1.Nodes.Add(tNode);
    			string[] strlogic=Environment.GetLogicalDrives();
    			foreach(string str in strlogic)
    			{
    				TreeNode mtNode=new TreeNode(str);
    				tNode.Nodes.Add(mtNode);
    				BStreeNode(new DirectoryInfo(str),1,mtNode);
    			}
    		}
    		private void treeView1_BeforeSelect(object sender,TreeViewCancelEventArgs e)
    		{
    			string str=e.Node.Text;
    			BStreeNode(new DirectoryInfo(str),1,e.Node);
    		}
    		private void treeView1_AfterExpan(object sender,TreeViewEventArgs e)
    		{
    			string str=e.Node.Text;
    			BStreeNode(new DirectoryInfo(str),1,e.Node);
    		}
    		// 整数n用于遍历目录的层数
    		private void BStreeNode(DirectoryInfo dir,int n,TreeNode tNode)
    		{
    			if(dir.Exists)
    			{
    				if(n>=0)
    				{
    					try
    					{
    						n--;
    						DirectoryInfo[] dirs=dir.GetDirectories();
    						tNode.Nodes.Clear();
    						if(dirs.Length>0)
    						{
    							foreach(DirectoryInfo sdir in dirs)
    							{
    								TreeNode tdNode=new TreeNode(sdir.FullName);
    								tNode.Nodes.Add(tdNode);
    								BStreeNode(sdir,n,tdNode);
    							}
    						}
    						FileInfo[] fis=dir.GetFiles();
    						if(fis.Length>0)
    						{
    							foreach(FileInfo fi in fis)
    							{
    								TreeNode ttfNode=new TreeNode(fi.FullName);
    								tNode.Nodes.Add(ttfNode);
    							}
    						}
    					}
    					catch{}
    				}
    			}
    		}
    

     

    基本要求都能现实,但在选择C:\windows目录后,软件长时间无反应。之前见过一段代码不使用递归方法,实现文件目录的下两层及上两层文件结构的遍历,然后将遍历的结束添加到treeview控件上。

    请教为什么在遍历windows目录后会出现无反应现象?还有没有性能更好的办法现实我需要的功能。

    2011年11月8日 4:01

答案

  • 解决方法已经找到,代码如下:
    		private void MainForm_Load(object sender,EventArgs e)
    		{
    			string rootStr="我的电脑";
    			TreeNode rTNode=new TreeNode(rootStr);
    			treeView1.Nodes.Add(rTNode);
    			getLocalLogic(rTNode);
    		}
    		private void getLocalLogic(TreeNode tNode)
    		{
    			string[] diskStr=Directory.GetLogicalDrives();
    			if(diskStr.Length>0)
    			{
    				foreach(string sstr in diskStr)
    				{
    					TreeNode stNode=new TreeNode(sstr);
    					tNode.Nodes.Add(stNode);
    				}
    			}
    		}
    		private void treeView1_AfterExpand(object sender,TreeViewEventArgs e)
    		{
    			TreeNode selectTNode=e.Node;
    			foreach(TreeNode stnode in selectTNode.Nodes)
    			{
    				if(stnode.Nodes.Count>0)
    				{
    					return;
    				}
    				else
    				{
    					string nstr=stnode.Text;
    					try
    					{
    						string[] strs=Directory.GetDirectories(nstr);
    						if(strs.Length>0)
    						{
    							foreach(string sstr in strs)
    							{
    								TreeNode utNode=new TreeNode(sstr);
    								stnode.Nodes.Add(utNode);
    							}
    						}
    						string[] files=Directory.GetFiles(nstr);
    						if(files.Length>0)
    						{
    							foreach(string fstr in files)
    							{
    								TreeNode ftNode=new TreeNode(fstr);
    								stnode.Nodes.Add(ftNode);
    							}
    						}
    					}
    					catch{}
    				}
    			}
    		}
    
    在这里谢谢余小章
    2011年11月11日 2:08

全部回复

  • dear

    请参考

    http://www.dotblogs.com.tw/yc421206/archive/2011/03/12/21808.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年11月8日 4:17
  • 解决方法已经找到,代码如下:
    		private void MainForm_Load(object sender,EventArgs e)
    		{
    			string rootStr="我的电脑";
    			TreeNode rTNode=new TreeNode(rootStr);
    			treeView1.Nodes.Add(rTNode);
    			getLocalLogic(rTNode);
    		}
    		private void getLocalLogic(TreeNode tNode)
    		{
    			string[] diskStr=Directory.GetLogicalDrives();
    			if(diskStr.Length>0)
    			{
    				foreach(string sstr in diskStr)
    				{
    					TreeNode stNode=new TreeNode(sstr);
    					tNode.Nodes.Add(stNode);
    				}
    			}
    		}
    		private void treeView1_AfterExpand(object sender,TreeViewEventArgs e)
    		{
    			TreeNode selectTNode=e.Node;
    			foreach(TreeNode stnode in selectTNode.Nodes)
    			{
    				if(stnode.Nodes.Count>0)
    				{
    					return;
    				}
    				else
    				{
    					string nstr=stnode.Text;
    					try
    					{
    						string[] strs=Directory.GetDirectories(nstr);
    						if(strs.Length>0)
    						{
    							foreach(string sstr in strs)
    							{
    								TreeNode utNode=new TreeNode(sstr);
    								stnode.Nodes.Add(utNode);
    							}
    						}
    						string[] files=Directory.GetFiles(nstr);
    						if(files.Length>0)
    						{
    							foreach(string fstr in files)
    							{
    								TreeNode ftNode=new TreeNode(fstr);
    								stnode.Nodes.Add(ftNode);
    							}
    						}
    					}
    					catch{}
    				}
    			}
    		}
    
    在这里谢谢余小章
    2011年11月11日 2:08
  • 谢谢您的分享。

    同时感谢余小章的帮助。


    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年11月11日 8:19
    版主