如何根据大小和日期从文件夹中删除文件

时间:2013-04-12 08:14:10

标签: asp.net file directory

假设我在一个文件夹中有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个相同大小的文件,我想删除这些文件,并根据它的时间只存储其中一个文件夹。我怎么能这样做?

2 个答案:

答案 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();
    }
}

上面修复了不按大小分组,最初按大小进行了第二次分组,而您的要求不需要。