【问题标题】:How to automatically update a property which contains file last modification date?如何自动更新包含文件最后修改日期的属性?
【发布时间】:2013-02-19 14:18:22
【问题描述】:

我有一个具有日期时间属性ImageModifiedDate 的实体,它存储图像的最后修改日期。如果我更改图像,这个属性可以以某种方式自动更新吗?我的意思是这个属性可以绑定到文件(图像)并且可以在实际文件更改时(自动)更改吗?

我在 asp.net mvc 3 应用程序中需要这个,但我认为它也可以标记为 c# 问题。

已编辑:我将图像存储在文件流中,而不是在数据库中

【问题讨论】:

  • 图像在哪里?在与 ASP.NET 应用程序相同的服务器上?您需要保持多长时间?到第二个?当您说“实体”时,您指的是实体框架吗?
  • 在同一台服务器上;如果能达到一秒钟就好了;不,我使用的是 Linq2Sql,我的意思是我的模型
  • 查看FileSystemWatcher 类,用于监控文件更改。

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


【解决方案1】:

您似乎有两个方面的问题:更新数据库中的最后修改日期,并知道数据库已更改,然后显示更改。

首先,创建一个 Windows 服务或类似程序,并让它使用 FileSystemWatcher 来监视文件更改。然后它可以使用新信息更新数据库。

至于在 Web 应用程序中显示更改,您可以让应用程序通过 AJAX 轮询并更新显示日期的 HTML。这样,您就不必在日期更改时更新整个页面。

【讨论】:

    【解决方案2】:

    您需要某种服务来检查您的图像并检查它们是否已更新。它需要做这样的事情:

    foreach (var image in dbcontext.Images)
    {
        var filename = image.Filename;
        var lastModified = System.IO.File.GetLastWriteTime(filename);
    
        if (lastModified != image.LastModified) 
        {
            image.LastModified = lastModified;        
        }
    }
    
    dbcontext.SaveChanges();
    

    请记住,您需要做出权衡决定。您可以让它不断运行,但这会降低您的服务器速度。或者您可以每分钟或每五分钟运行一次,具体取决于您拥有多少张图片以及完成该过程需要多长时间。

    或者,您可以使用FileSystemWatcher,类似以下内容(请记住,我尚未测试此代码,但足以让您入门):

    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.Path = "your path here";
    watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
    watcher.Filter = "*.jpg";
    
    watcher.Changed += new FileSystemEventHandler(OnChanged);
    watcher.Created += new FileSystemEventHandler(OnChanged);
    watcher.Deleted += new FileSystemEventHandler(OnChanged);
    watcher.Renamed += new RenamedEventHandler(OnRenamed);
    
    
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed, created, or deleted.
       Console.WriteLine("File: " +  e.FullPath + " " + e.ChangeType);
    }
    
    private static void OnRenamed(object source, RenamedEventArgs e)
    {
        // Specify what is done when a file is renamed.
        Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
    }    
    

    【讨论】:

    • 我将图像存储在实际文件流中,而不是数据库中。我有数十万张图像,如果我每分钟运行一次,我认为它真的会降低服务器的速度。还有其他方法吗?我还希望图像能够立即更新(当然,如果可以的话)。
    • 可能使用FileSystemWatcher? @AlekseiChepovoi 查看更新。
    猜你喜欢
    • 2020-05-12
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多