目录修改监视
时间:2020-03-06 14:31:00 来源:igfitidea点击:
我正在构建一个C应用程序,它将监视指定目录的更改和添加并将信息存储在数据库中。
我想避免检查每个文件是否有修改,但是我不确定是否可以完全信任文件访问时间。
在目录中获取最近修改的文件的最佳方法是什么?
它只会在用户要求时检查修改,而不会是持续运行的服务。
解决方案
嗯...一个有趣的问题。最初,我会把我们指向FileSystemWatcher类。但是,如果要根据用户要求使其工作,那么似乎我们可能需要先存储目录信息,然后在每次用户请求时进行比较。我可能会选择FileSystemWatcher并以任何方式存储结果。
我认为FileSystemWatcher类提供了我们想要的东西。
本教程描述了如何使用它来监视目录以在简单的Windows服务中进行更改。如何在C#中实现简单的Filewatcher Windows服务
使用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. }
如果我们只需要它来检查用户何时才询问而不是一直询问,则不要使用FileSystemWatcher。尤其是如果它是共享资源,那么我们最后想要的是50台客户机在观看同一共享目录。
这可能只是一个错字,但我们不应该查看文件访问时间,而要查看文件修改时间以获取更改。即使那样也不可靠。
我要做的是在文件日期和字节大小或者其他文件系统属性上实现某种校验和功能。这样,我将不会只在文件的属性中查找整个文件中的更改,而是可以根据要求进行更改,而不必尝试保持与远程资源的连接以对其进行监视。
较重的解决方案是采用另一种方法,然后在托管共享驱动器的计算机上安装服务,该服务可以监视文件并记录更改。然后,我们可以查询该服务,而不是完全不接触文件,但这可能是过大了。