Jas*_*mar 4 .net c# linq directory file
有没有办法使用像这样的 LINQ命令从SearchOption中排除某些目录
string path = "C:\SomeFolder";
var s1 = Directory.GetFiles(path , "*.*", SearchOption.AllDirectories);
var s2 = Directory.GetDirectories(path , "*.*", SearchOption.AllDirectories);
Run Code Online (Sandbox Code Playgroud)
该路径由Sub1和Sub2文件夹组成,其中包含某些文件.我需要将它们从目录搜索中排除.
谢谢
这项工作:
string[] exceptions = new string[] { "c:\\SomeFolder\\sub1",
"c:\\SomeFolder\\sub2" };
var s1 = Directory.GetFiles("c:\\x86", "*.*",
SearchOption.AllDirectories).Where(d => exceptions.All(e =>
!d.StartsWith(e)));
Run Code Online (Sandbox Code Playgroud)
这有助于例外
不,据我所知,没有.但是你可以使用非常简单的LINQ在一行中完成.
var s1 = Directory.GetFiles(path , "*.*", SearchOption.AllDirectories).Where(d => !d.StartsWith("<EXCLUDE_DIR_PATH>")).ToArray();
Run Code Online (Sandbox Code Playgroud)
您也可以轻松组合多个排除DIR.
使用简单的 LINQ 方法无法完全满足您的要求。您将需要编写一个递归例程而不是使用SearchOption.AllDirectories. 原因是您要过滤目录而不是文件。
您可以使用以下静态方法来实现您想要的:
public static IEnumerable<string> GetFiles(
string rootDirectory,
Func<string, bool> directoryFilter,
string filePattern)
{
foreach (string matchedFile in Directory.GetFiles(rootDirectory, filePattern, SearchOption.TopDirectoryOnly))
{
yield return matchedFile;
}
var matchedDirectories = Directory.GetDirectories(rootDirectory, "*.*", SearchOption.TopDirectoryOnly)
.Where(directoryFilter);
foreach (var dir in matchedDirectories)
{
foreach (var file in GetFiles(dir, directoryFilter, filePattern))
{
yield return file;
}
}
}
Run Code Online (Sandbox Code Playgroud)
你会像这样使用它:
var files = GetFiles("C:\\SearchDirectory", d => !d.Contains("AvoidMe", StringComparison.OrdinalIgnoreCase), "*.*");
Run Code Online (Sandbox Code Playgroud)
为什么增加了复杂性? 这种方法完全避免了查看您不感兴趣的目录。SearchOption.AllDirectories顾名思义,将在所有目录中搜索。
如果您不熟悉迭代器方法(yield return语法),可以用不同的方式编写:只要问!
这几乎具有相同的效果。但是,它仍然会在您要忽略的目录的子目录中查找文件。也许这对你来说没问题;代码更容易遵循。
public static IEnumerable<string> GetFilesLinq(
string root,
Func<string, bool> directoryFilter,
string filePattern)
{
var directories = Directory.GetDirectories(root, "*.*", SearchOption.AllDirectories)
.Where(directoryFilter);
List<string> results = new List<string>();
foreach (var d in directories)
{
results.AddRange(Directory.GetFiles(d, filePattern, SearchOption.TopDirectoryOnly));
}
return results;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15798 次 |
| 最近记录: |