当前位置:首页>>ASP.NET教程>>Asp.NET综合技巧>>文件夹遍历[合成模式]
文件夹遍历[合成模式]
2009/11/8 13:19:18
using System;
using System.Collections.Generic;

using System.Text;

using System.IO;

namespace PatternsStudy6_1
{
    class Program
    {
        private static int intCount = 0;

        /// <summary>
        /// 记录文件个数
        /// </summary>
        public static int IntCount
        {
            get
            {
                return intCount;
            }
        }
        
        static void Main(string[] args)
        {
            string strDirName = @"E:\Drivers";

            Search_Folder root = GetRoot(strDirName);

            root.Display(1);

            Console.WriteLine(IntCount.ToString() + " -files");

            Console.Read();
        }

        /// <summary>
        /// 取得Search_Folder实例
        /// </summary>
        /// <param name="strDirName">文件夹名</param>
        /// <returns></returns>
        static Search_Folder GetRoot(string strDirName)
        {
            Search_Folder root = new Search_Folder(strDirName);

            //取得strDirName下所有文件名
            string[] strFiles = Directory.GetFiles(strDirName);

            foreach (string str in strFiles)
            {
                root.Add(new Search_File(str));
                intCount++;
            }

            //取得strDirName下所有文件夹名
            string[] strFolders = Directory.GetDirectories(strDirName);

            foreach (string str in strFolders)
            {
                //自身调用,递归
                root.Add(GetRoot(str));
            }
            return root;
        }
    }

    /// <summary>
    /// 搜索的抽象基类
    /// </summary>
    abstract class Search
    {
        /// <summary>
        /// 名称
        /// </summary>
        protected string m_strName;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="strName">名称</param>
        public Search(string strName)
        {
            m_strName = strName;
        }

        /// <summary>
        /// 用于屏幕显示的抽象函数
        /// </summary>
        /// <param name="intDept">深度</param>
        public abstract void Display(int intDept);
    }

    /// <summary>
    /// 文件
    /// </summary>
    class Search_File : Search
    {
        
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="strName">文件名</param>
        public Search_File(string strName)
            : base(strName)
        { }

        /// <summary>
        /// 屏幕显示
        /// </summary>
        /// <param name="intDept">深度</param>
        /// <remarks>显示形式: --文件名</remarks>
        public override void Display(int intDept)
        {
            Console.WriteLine(new String('-', intDept) + base.m_strName);
      &