建站代码网

热门标签

搜索当前目录的子目录或者上级目录下的子目录中特定的目录

 首先,搜索当前目录下的子目录,如果没有,逐层搜索上级目录下面的所有子目录,有没有特定的目录。为了防止其它子目录可能跟目标目录重名,还可以同时指定目标目录下特定的一级子目录或者文件。这也是一个“深度优先搜索”的例子。下面是完整的代码:

 

/// <summary>

    /// 搜索特定的目录

    /// </summary>

    public class SearchSpecFolder

    {

        /// <summary>

        /// 当前搜索总次数

        /// </summary>

        public int SerachCount { get; private set; }

 

        /// <summary>

        /// 搜索指定的目录名称,先从当前目录的子目录进行搜索,如果没有搜索到,从当前目录的父目录开始搜索

        /// </summary>

        /// <param name="baseDir">搜索开始的目录</param>

        /// <param name="targetName">目标目录名称</param>

        /// <param name="matchChildDir">可选需要继续匹配的目标目录下的子目录</param>

        /// <param name="matchChildFile">可需要继续选匹配的目标目录下的文件</param>

        /// <returns>如果没有搜索到,返回空字符串</returns>

        public string SearchSpectionFolderWithParent(string baseDir, string targetName, string matchChildDir=null, string matchChildFile=null)

        {

            Console.WriteLine("--Search Parent:{0}", baseDir);

            string obj = SearchSpectionChildFolder(baseDir, targetName, matchChildDir, matchChildFile);

            if (obj == "")

            {

                //如果子目录没有搜索到,搜索上级目录

                var parentDir = System.IO.Directory.GetParent(baseDir);

                if (parentDir == null)

                    return "";

                return SearchSpectionFolderWithParent(parentDir.FullName, targetName, matchChildDir, matchChildFile);

            }

            return obj;

        }

 

        /// <summary>

        /// 从子目录搜索包含指定目录名称的目录,可以选择用一个子目录或者目录下面的一个文件来匹配当前是正确的目标目录(因为在其它目录下可能有重名的当前目录名称)

        /// </summary>

        /// <param name="baseFolder">当前目录</param>

        /// <param name="targetName">指定的目录名称</param>

        /// <param name="matchChildDir">可选需要继续匹配的目标目录下的子目录</param>

        /// <param name="matchChildFile">可需要继续选匹配的目标目录下的文件</param>

        /// <returns>匹配的目录名称</returns>

        private string SearchSpectionChildFolder(string baseFolder, string targetName, string matchChildDir, string matchChildFile)

        {

            SerachCount++;

            if (baseFolder == "")

                return "";

            //搜索当前子目录

            var allDir = System.IO.Directory.GetDirectories(baseFolder);

            foreach (var dir in allDir)

            {

                Console.WriteLine(dir);

                if (dir.EndsWith(targetName, StringComparison.OrdinalIgnoreCase))

                {

                    //匹配到目标目录,还需要匹配它的子目录名称或者包含的一个文件名称

                    if (!string.IsNullOrEmpty(matchChildDir))

                    {

                        string objPath = System.IO.Path.Combine(dir, matchChildDir);

                        if (System.IO.Directory.GetDirectories(dir).Contains(objPath))

                            return dir;

                    }

                    else if (!string.IsNullOrEmpty(matchChildFile))

                    {

                        string objPath = System.IO.Path.Combine(dir, matchChildFile);

                        if (System.IO.Directory.GetFiles(dir).Contains(matchChildFile))

                            return dir;

                    }

                    else

                    {

                        return dir;

                    }

                }

                //深度优先,搜索子目录

                string temp = SearchSpectionChildFolder(dir, targetName, matchChildDir, matchChildFile);

                if (temp != "")

                    return temp;

            }

            return "";//未找到,返回空

        }

    }

 

X