遍历获得磁盘文件的两种方式

    在winform中可能有这种情况,遍历某一个文件夹得到当前文件夹中的所有文件以及子文件夹中的所有文件,以此类推,然后添加到一个TreeView控件中,或者通过控制台输出文件以及文件夹的名称。方法多种多样,下面说的是通过递归和队列的方式来进行。递归其实就是在函数调用的时候进行压栈进行的,所以可以概述为通过栈和队列来实现。

递归方式实现

        private void GetAllFile (string strPath,TreeNode parentNode)
        {
			//得到当前路径下的所有文件和文件夹
            string[] dirs = Directory.GetDirectories(strPath);
            string[] files = Directory.GetFiles(strPath);
            //遍历文件夹数组将每一个文件夹添加上去
            foreach (string dir in dirs)
            {
               // TreeNode node = new TreeNode(dir.Substring(dir.LastIndexOf("\") + 1));
                TreeNode node = new TreeNode(Path.GetFileName(dir));
				//将当前的路径存储在节点的Tag属性中,方便以后获取当前节点的路径
                node.Tag = dir;
				//添加当前节点到传递过来的节点下面
                parentNode.Nodes.Add(node);
				//递归调用,将当前的文件夹路径和当前的节点传递过去,
                GetAllFile(dir,node);
            }
			//遍历当前文件数组,创建新的节点加到传递过来的父节点上面
            foreach (string file in files)
            {
               // TreeNode node = new TreeNode(file.Substring(file.LastIndexOf("\" )+1));
                TreeNode node = new TreeNode(Path.GetFileName(file));
                node.Tag = file;
                parentNode.Nodes.Add(node);
            }
        }

     通过递归方式来实现的时候,主调函数中需要传递一个目录和一个根节点,一般是这个根节点的信息就是根据这个跟目录创建的

        private void btnView_Click (object sender, EventArgs e)
        {
            //获取文本框中输入的路径
            string strs = txtPath.Text;
            if (!string.IsNullOrEmpty(strs))
            {
                //创建一个节点
                TreeNode tn = new TreeNode(strs.Substring(strs.LastIndexOf('\') + 1));
                //添加节点到界面上的TreeView控件中
                tvContent.Nodes.Add(tn);
                GetAllFile(strs, tn);
            }
        }

队列实现:

    队列实现同样要用到TreeView,队列是先进先出结构,代码中利用List<string>来模拟了一个队列,没有采用C#提供的泛型队列,效果是一样的。主函数如下:

        static void QueueDirectory(string rootDir)
        {
            List<TreeNode> list = new List<TreeNode>();
            TreeNode rootNode = new TreeNode(Path.GetFileName(rootDir));
            rootNode.Tag = rootDir;
            list.Add(rootNode);
            //将节点添加到界面上的treeview控件中
            tvContent.Nodes.Add(rootNode);
            //Console.WriteLine(rootDir);
            while(true)
            {
                if(list.Count() == 0)
                {
                    break;
                }
                else
                {
                    //将队列中存放的节点给取出来
                    TreeNode parentNode = list[0];
                    list.RemoveAt(0);
                    //得到节点里面存储的路径
                    string parentDir = parentNode.Tag.ToString();
                    //得到路径下的所有文件和文件夹
                    string[] dirs = Directory.GetDirectories(parentDir);
                    string[] files = Directory.GetFiles(parentDir);
                    //遍历文件夹
                    foreach(string dir in dirs)
                    {
                        //创建一个新的节点,添加到队列中
                        TreeNode node = new TreeNode(Path.GetFileName(dir));
                        node.Tag = dir;
                        parentNode.Nodes.Add(node);//这主要是在Winform中可以添加到界面上
                        list.Add(node);
                        //Console.WriteLine("目录:"+dir);//用于控制台输出,
                    }
                    foreach(string file in files)
                    {
                        TreeNode node = new TreeNode(Path.GetFileName(file));
                        node.Tag = file;
                        parentNode.Nodes.Add(node);
                        //Console.WriteLine("文件:"+file);
                    }
                }
            }
        }

    和递归方式差不多,参数中也可以将根节点传递过来,也可以不传。代码中 Console.WriteLine()是在控制台输出时用的,winform中不需要。利用的同样是TreeNode来实现,因为它不但可以得到当前节点的父节点子节点而且还能够保存当前的路径,而如果队列中保存当前的文件路径则无法实现。调用方式和堆栈中差不多,只是传递一个根节点就OK,也可以用堆栈中同一个主调函数,把根节点传递过来就可以了。

原文地址:https://www.cnblogs.com/qigang/p/3823269.html