2008-09-21 166 views
6

我正在构建一个C#应用程序,该应用程序将监视指定目录的更改和添加并将信息存储在数据库中。目录修改监视

我想避免检查每个单独的文件进行修改,但我不确定是否可以完全信任文件访问时间。

什么是最好的方法来获取目录中最近修改的文件?

它只会在用户提出要求时才检查修改,它不会是一个持续运行的服务。

+0

您是否有一个始终运行的服务,或者您是否希望程序在每次运行时都检索最近修改过的文件,而无需不断监视文件系统?请澄清这个问题。 – 2008-09-21 21:52:50

回答

1

嗯......有趣的问题。最初,我会告诉你FileSystemWatcher课程。但是,如果你打算让它工作,那么根据用户的请求,那么你可能需要最初存储目录信息,然后每次用户请求时进行比较。无论如何,我可能会使用FileSystemWatcher,并将结果存储起来。

6

使用FileSystemWatcher对象。这里有一些代码来做你正在寻找的东西。

 
    // Declares the FileSystemWatcher object 
    FileSystemWatcher watcher = new FileSystemWatcher(); 

    // We have to specify the path which has to monitor 

    watcher.Path = @"\\somefilepath";  

    // This property specifies which are the events to be monitored 
    watcher.NotifyFilter = NotifyFilters.LastAccess | 
     NotifyFilters.LastWrite | NotifyFilters.FileName | notifyFilters.DirectoryName; 
    watcher.Filter = "*.*"; // Only watch text files. 

    // Add event handlers for specific change events... 

    watcher.Changed += new FileSystemEventHandler(OnChanged); 
    watcher.Created += new FileSystemEventHandler(OnChanged); 
    watcher.Deleted += new FileSystemEventHandler(OnChanged); 
    watcher.Renamed += new RenamedEventHandler(OnRenamed); 
    // Begin watching. 
    watcher.EnableRaisingEvents = true; 


    // Define the event handlers. 
    private static void OnChanged(object source, FileSystemEventArgs e) 
    { 
    // Specify what is done when a file is changed, created, or deleted. 
    } 

    private static void OnRenamed(object source, RenamedEventArgs e) 
    { 
    // Specify what is done when a file is renamed. 
    } 
1

如果您只需要它来检查用户询问而不是所有的时间,则不要使用FileSystemWatcher。特别是如果它是一个共享资源 - 你最不想要的是50个客户机器看着同一个共享目录。

它可能只是一个错字,但你不应该看文件访问时间,你想看看文件修改时间来获取更改。即使这不可靠。

我会做的是在文件日期和字节大小或其他文件系统属性上实现某种校验和功能。这样我就不会在整个文件中寻找更改 - 只有它的属性和我可以根据请求做到这一点,而不是试图保持与远程资源的连接来监视它。

较重的解决方案是反过来,并在托管共享驱动器的计算机上安装一项服务,该服务器可以监视文件并记录更改。然后你可以查询服务而不是触摸这些文件 - 但它可能是矫枉过正的。