使用Linq查找物理文件

时间:2014-11-20 09:59:25

标签: vb.net linq

假设我有这样的目录结构:

TestFile1-2011140930.txt - last modified on 20/11/14 at 09:30
TestFile1-2011141301.txt - last modified on 20/11/14 at 13:01
TF2-2011140130.txt - last modified on 20/11/14 at 01:30
TF2-2011140630.txt - last modified on 20/11/14 at 06:30

文件名遵循以下名称结构:{FileName} - {ddmmyytttt} .txt。我想确保保留最新更新的文件名,并删除其余文件。例如,列表条目1和列表条目2具有相同的文件名。列表条目2在列表条目2之后被修改,因此列表条目1被删除。同样,列表条目3和列表条目4具有相同的文件名。列表条目4在列表条目3之后被修改,因此列表条目3被删除。

我目前通过循环遍历目录中的每个文件来解决这个问题,但这是低效的,因为我遍历所有文件 - 即使是那些今天没有创建的文件,因此没有重复文件。我希望能够使用Lambda表达式来完成它。我已经研究过如何做到这一点,我遇到了这个问题:How to find the most recent file in a directory using .NET, and without looping?和这段代码:

var myFile = directory.GetFiles()
             .OrderByDescending(f => f.LastWriteTime)
             .First();

我是Linq的新手。我精通SQL。是否可以修改上面的查询(比如SQL),以便查询符合我的要求或者我的要求太复杂了?

上面的代码片段是C#,但我正在寻找一个VB.NET解决方案。

1 个答案:

答案 0 :(得分:0)

以下是适合您的解决方案。但是,为什么要解析上次修改日期的文件名而不是使用FileInfo.LastWriteTime

Sub Main()
    Dim directoryInfo = New DirectoryInfo("d:\a")
    Dim files = directoryInfo.GetFiles()
    Dim needToDelete = files.[Select](Function(f)
                                         Dim parts = Path.GetFileNameWithoutExtension(f.Name).Split("-"c)
                                         Return New With { _
                                             Key .Name = parts(0), _
                                             Key .Dt = DateTime.ParseExact(parts(1), "ddMMyyhhmm", CultureInfo.InvariantCulture), _
                                             Key .F = f _
                                         }

                                     End Function) _
    .GroupBy(Function(a) a.Name) _
    .SelectMany(Function(a) a.OrderByDescending(Function(f) f.Dt) _
                    .Skip(1)) _
                .[Select](Function(f) f.F)

    For Each fileInfo As FileInfo In needToDelete
        fileInfo.Delete()
    Next
End Sub

<强>更新

我做了一些改进。