首先,搜索当前目录下的子目录,如果没有,逐层搜索上级目录下面的所有子目录,有没有特定的目录。为了防止其它子目录可能跟目标目录重名,还可以同时指定目标目录下特定的一级子目录或者文件。这也是一个“深度优先搜索”的例子。下面是完整的代码:
/// <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 "";//未找到,返回空
}
}
热门信息
阅读 (145)
1 在Web上修改指定文件位置的Web.config阅读 (141)
2 使用XCopy备份指定日期之后的资料阅读 (137)
3 ASP.NET MVC 上传文件阅读 (134)
4 使用angularJS 绑定站点信息阅读 (133)
5 VS复制项目生成的文件到另外一个项目运行目录下