我不知道在StackOverflow上发布你自己的问题答案是否合法,但我看到没有人问过这个问题.我去寻找一个C#Glob并没有找到一个,所以我写了一个其他人可能觉得有用的.
////// return a list of files that matches some wildcard pattern, e.g. /// C:\p4\software\dotnet\tools\*\*.sln to get all tool solution files /// /// pattern to match ///all matching paths public static IEnumerableGlob(string glob) { foreach (string path in Glob(PathHead(glob) + DirSep, PathTail(glob))) yield return path; } /// /// uses 'head' and 'tail' -- 'head' has already been pattern-expanded /// and 'tail' has not. /// /// wildcard-expanded /// not yet wildcard-expanded ///public static IEnumerable Glob(string head, string tail) { if (PathTail(tail) == tail) foreach (string path in Directory.GetFiles(head, tail).OrderBy(s => s)) yield return path; else foreach (string dir in Directory.GetDirectories(head, PathHead(tail)).OrderBy(s => s)) foreach (string path in Glob(Path.Combine(head, dir), PathTail(tail))) yield return path; } /// /// shortcut /// static char DirSep = Path.DirectorySeparatorChar; ////// return the first element of a file path /// /// file path ///first logical unit static string PathHead(string path) { // handle case of \\share\vol\foo\bar -- return \\share\vol as 'head' // because the dir stuff won't let you interrogate a server for its share list // FIXME check behavior on Linux to see if this blows up -- I don't think so if (path.StartsWith("" + DirSep + DirSep)) return path.Substring(0, 2) + path.Substring(2).Split(DirSep)[0] + DirSep + path.Substring(2).Split(DirSep)[1]; return path.Split(DirSep)[0]; } ////// return everything but the first element of a file path /// e.g. PathTail("C:\TEMP\foo.txt") = "TEMP\foo.txt" /// /// file path ///all but the first logical unit static string PathTail(string path) { if (!path.Contains(DirSep)) return path; return path.Substring(1 + PathHead(path).Length); }