假设我有这样的目录结构:
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解决方案。
答案 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
<强>更新强>
我做了一些改进。