【问题标题】:Trying to delete files older than X number of days on insert in .NET MVC尝试删除在.NET MVC 中插入超过 X 天的文件
【发布时间】:2015-09-03 19:50:55
【问题描述】:

我正在尝试根据“上次修改日期”删除目录中超过 10 天的文件。它应该做的是从 moxiemanager 上传中获取输入,它会这样做,并将其输入到数据库中,它会这样做。然后它应该删除超过 10 天的文件,但它不会。以下是我的代码:

public ActionResult CreateMain(BulletinsViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        BulletinsContext.tblBulletins.Add(new tblBulletin
        {
            ID = viewModel.BulletinID,
            BulletinDisplayDate = viewModel.BulletinDisplayDate,
            BulletinFilename = viewModel.MainBulletinName
        });

        DirectoryInfo DI = new DirectoryInfo(Server.MapPath("~/Files/Bulletins"));
        FileSystemInfo[] FSI = DI.GetFiles();
        foreach (FileSystemInfo fInfo in FSI)
        {
            if (fInfo.Extension == ".pdf")
            {
                DateTime dt = DateTime.Now.AddDays(-10);
                if (fInfo.CreationTime < dt)
                    try
                    {
                        fInfo.Delete();
                    }
                    catch { }
                }
            }
            BulletinsContext.SaveChanges();
            return RedirectToAction("MainBulletins");
        }

    return View(viewModel);
}

我在想这可能是文件路径不是此方法的正确语法,或者“fInfo.CreationTime”部分错误,但我觉得 CreationTime 将被最后修改?

【问题讨论】:

  • 您正在丢弃异常,您确定没有任何可以解释问题的方法吗?使用调试器查看为什么它没有做它应该做的事情?
  • 另一种方法是将这些信息存储在数据库中。每次创建文件时,都会添加一行及其 CreationDate。然后,您可以简单地找到所有超过 N 天的文件
  • @SamiKuhmonen - 异常对我来说是一个非常薄弱的​​环节,最好的方法是什么?
  • @Kilanny 有一个数据库,它保存文件的路径和显示文件的日期(这些都是每天完成的,所以只显示一天)。然后,如果文件超过 10 天,我们希望从目录中删除它们,否则它只会变得混乱
  • @SouthWilts 难道你不能通过每次修改/创建文件时更新行来保持你的数据库总是最新的吗?只依赖你的数据,不要再使用 Windows 文件系统了。

标签: c# asp.net asp.net-mvc


【解决方案1】:

您需要获取文件的LastModifiedDate,您可以通过FileSystemInfo 类的属性LastWriteTime 获取该文件。

像这样改变你的 if 条件

if (fInfo.LastWriteTime < dt)
{
 //your code
}

【讨论】:

    【解决方案2】:

    尝试为此编写查询并将其应用到代码中。

    var cutoff = DateTime.Now.AddDays(-10);
        var path = new DirectoryInfo(sourcePath);
        var query = path.GetFiles(filename, SearchOption.TopDirectoryOnly)
                        .Where(fi => fi.CreationTime < cutoff);
    

    试试这个查询,这可能对你很简单也很有帮助。

    【讨论】:

    • “文件名”的问题是那不会删除某个名称的文件吗?不需要说出名字,因为我们永远不会知道它会是什么。
    • 你有一个名为GetFiles的方法,你可以从那里选择要删除的文件
    【解决方案3】:

    代码如下:

    [HttpPost]
    public ActionResult CreateMain(BulletinsViewModel viewModel)
    {
        if (ModelState.IsValid)
        {
            BulletinsContext.tblBulletins.Add(new tblBulletin
            {
                ID = viewModel.BulletinID,
                BulletinDisplayDate = viewModel.BulletinDisplayDate,
                BulletinFilename = viewModel.MainBulletinName
            });
    
            //Delete files older than X amount of days
            DirectoryInfo DI = new DirectoryInfo("D:/Inetpub/WWWroot/intranet/Dashboard/Dashboard/Files/Bulletins");
            FileSystemInfo[] FSI = DI.GetFiles();
            foreach (FileSystemInfo fInfo in FSI)
            {
                if (fInfo.Extension == ".pdf")
                {
                    DateTime dt = DateTime.Now.AddDays(-10);
                    if (fInfo.LastWriteTime < dt)
                        try
                        {
                            fInfo.Delete();
                        }
                        catch { }
                }
            }
    
            BulletinsContext.SaveChanges();
            return RedirectToAction("MainBulletins");
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多