首页 > 解决方案 > System.IO - 使用 Directory/LINQ 将列表中的某些文件替换为其他文件

问题描述

因此,我得到了使用 System.IO 目录的文件列表:

var srcFiles = Directory.GetFiles(remotePath);

我还有一个逗号分隔的字符串列表,我想检查每个字符串在上述文件的名称中是否不存在。例如:

string[] filterOn = EndPoint.FileNameDoesNotContainFilter.Split(',').ToArray();

给了我以下数组:

filterOn contains ["GoodFile", "EvenBetterFile"]

现在,没有这两个字符串中的任何一个的文件将替换上面 srcFiles 列表中当前的所有文件(或者一个新列表,如果这更有意义的话)。我试图用 LINQ 做到这一点,但不能完全做到。它是如何完成的?

编辑:@dvo 的答案给了我正确的文件,但是,有时过滤器字符串包含在传入的 remotePath 中。

典型路径/文件:C:\TEMP\APPS\AMS\Services\sc0189v\APPS\GoodFile\test.txt。

如您所见,“GoodFile”在路径中,但不在文件名中。然而这个文件应该被拒绝。我想我正在 System.IO.Directory 中寻找可能有帮助的东西。不确定,真的。

标签: linqsystem.io.filesystem.io.directory

解决方案


尝试这个:

var noMatch = srcFiles.Where(file => !filterOn.Any(filter => file.ToUpperInvariant().Contains(filter.ToUpperInvariant()))).ToList();

这将创建一个新列表,其中文件名不包含任何过滤器。这通过将文件名和过滤器都转换为大写来忽略大小写。如果替换为 ,则可以将结果存储在同一个列表noMatchsrcFiles。如果从子句.ToUpperInvariant()的两个部分中删除,则可以使其区分大小写。您可以通过从子句Any中删除来捕获过滤器匹配项。!Where

希望这可以帮助!


推荐阅读