假设我在一个文件夹中有4个文件。昨天有2个文件(第1个文件 - 1个月2个文件 - 2个)和2个今天的文件(第1个文件 - 5个月2个文件 - 10个月)。
首先,我想检查每个文件的日期,并根据该文件从文件夹中删除最小尺寸的文件。
在我的代码中,我删除了所有文件的最小尺寸,但我想删除每天最小尺寸的文件。
这是我的代码:
private void DeleteFiles()
{
var di = new DirectoryInfo("E:\\UploadFiles");
var files = di.GetFiles().GroupBy(f => f.LastWriteTime.Date);
foreach (var fileGrp in files)
{
var maxFile = fileGrp.Max(r => r.Length);
foreach (FileInfo file in fileGrp.Where(r => r.Length < maxFile))
{
file.Delete();
}
}
}
protected void Button1_Click(object sender, EventArgs e)
{
this.DeleteFiles();
}
此代码运行正常,首先我根据日期对文件进行分组,然后删除除最大文件之外的所有文件。现在我想要的是如果同一日期有4个相同大小的文件,我想删除这些文件,并根据它的时间只存储其中一个文件夹。我怎么能这样做?
答案 0 :(得分:2)
如何按大小(从最小到最大)按顺序排序文件,然后按最后写入时间(从最旧到最新)排序,并删除直到只留下一个(最大,或者如果所有大小相同,则最新):
private void DeleteFiles()
{
var di = new DirectoryInfo("E:\\UploadFiles");
var files = di.GetFiles().GroupBy(f => f.LastWriteTime.Date);
foreach (var fileGrp in files)
{
int fileCount = fileGrp.Count();
foreach (FileInfo f in fileGrp.OrderBy(a => a.Length).ThenBy(a => a.LastWriteTime))
{
if (fileCount > 1)
{
f.Delete();
fileCount--;
}
else break;
}
}
}
答案 1 :(得分:0)
我认为应该这样做。在您正在使用的当天删除之后重新捕获文件,并删除除最新版本之外的所有文件:
private void DeleteFiles() {
var di = new DirectoryInfo("E:\\UploadFiles");
var files = di.GetFiles().GroupBy(f => f.LastWriteTime.Date);
foreach (var fileGrp in files) {
DateTime currentDay = fileGrp.First().LastWriteTime.Date;
var maxFile = fileGrp.Max(r => r.Length);
foreach (FileInfo file in fileGrp.Where(r => r.Length < maxFile)) {
file.Delete();
}
var filesCurrentDay = di.GetFiles()
.Where(f => f.LastWriteTime.Date == currentDay.Date);
var maxFileTime = fileGrp.Max(r => r.LastWriteTime.ToFileTimeUtc());
foreach (FileInfo file in filesCurrentDay
.Where(r => r.LastWriteTime.ToFileTimeUtc() < maxFileTime)) {
file.Delete();
}
}
protected void Button1_Click(object sender, EventArgs e) {
this.DeleteFiles();
}
}
上面修复了不按大小分组,最初按大小进行了第二次分组,而您的要求不需要。