【问题标题】:System.IO - Use Directory/LINQ to Replace Some Files in a List with OthersSystem.IO - 使用 Directory/LINQ 将列表中的某些文件替换为其他文件
【发布时间】:2019-09-24 06:42:35
【问题描述】:

我因此得到了使用 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 中寻找可能有帮助的东西。不确定,真的。

【问题讨论】:

    标签: linq system.io.file system.io.directory


    【解决方案1】:

    试试这个:

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

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

    希望这会有所帮助!

    【讨论】:

    • 建议创建 filterOn 数组大写而不是每次测试都大写每个元素。
    • 是的。做到了。如果您想帮助解决相关问题,请参阅我的问题。
    • System.IO.Path.GetFileNameWithoutExtension(file.ToUpper()) 怎么样?整行:var noMatch = srcFiles.Where(file => !filterOn.Any(filter => System.IO.Path.GetFileNameWithoutExtension(file.ToUpperInvariant()).Contains(filter.ToUpperInvariant()))).ToList();。将此与 NetMage 的建议相结合,并从过滤器中删除 ToUpperInvariant
    猜你喜欢
    • 2020-09-25
    • 2015-11-13
    • 2022-06-13
    • 1970-01-01
    • 2021-03-24
    • 2014-11-18
    • 2019-01-11
    • 1970-01-01
    • 2020-08-03
    相关资源
    最近更新 更多