你可以试试嵌套查询:
- 枚举
@"\\Computer1\" 内的顶级目录
- 枚举这些顶级目录中的文件:
代码:
using System.IO;
using System.Linq;
...
var files = Directory
.EnumerateDirectories( @"\\Computer1\", "*", SearchOption.TopDirectoryOnly)
.SelectMany(dir => Directory
.EnumerateFiles(dir, "Application.exe", SearchOption.TopDirectoryOnly));
foreach (var file in files) {
...
}
编辑:如果你想枚举第一层和第二层的文件,你可以嵌套查询一次:
var files = Directory
.EnumerateDirectories( @"\\Computer1\", "*", SearchOption.TopDirectoryOnly)
.SelectMany(dir => Directory
// 1st level
.EnumerateFiles(dir, "Application.exe", SearchOption.TopDirectoryOnly)
// 2nd level
.Concat(Directory
.EnumerateDirectories(dir, "*", SearchOption.TopDirectoryOnly)
.SelectMany(subdir => Directory.EnumerateFiles(subdir, "Application.exe", SearchOption.TopDirectoryOnly))));
一般情况我们可以实现
private static IEnumerable<string> EnumerateDirectories(string root, int level) {
int current = 0;
Queue<string> agenda = new Queue<string>();
agenda.Enqueue(root);
while (current <= level) {
var list = agenda.ToList();
agenda.Clear();
foreach (var dir in list) {
if (current > 0)
yield return dir;
if (current < level)
foreach (var subdir in Directory.EnumerateDirectories(dir))
agenda.Enqueue(subdir);
}
current += 1;
}
}
使用它:
// All subdirectories, up and including 2nd level
var files = EnumerateDirectories(@"\\Computer1\", 2)
.SelectMany(dir => Directory
.EnumerateFiles(dir, "Application.exe", SearchOption.TopDirectoryOnly));
foreach (var file in files) {
...
}