6

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

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

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

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

4

4 回答 4

6

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

    // 声明 FileSystemWatcher 对象
    FileSystemWatcher watcher = new FileSystemWatcher();

    // 我们必须指定要监控的路径

     watcher.Path = @"\\somefilepath";     

    // 此属性指定要监视的事件
     watcher.NotifyFilter = NotifyFilters.LastAccess |
       NotifyFilters.LastWrite | NotifyFilters.文件名 | notifyFilters.DirectoryName;
    watcher.Filter = "*.*"; // 只看文本文件。

    // 为特定的更改事件添加事件处理程序...

    watcher.Changed += new FileSystemEventHandler(OnChanged);
    watcher.Created += new FileSystemEventHandler(OnChanged);
    watcher.Deleted += new FileSystemEventHandler(OnChanged);
    watcher.Renamed += new RenamedEventHandler(OnRenamed);
    // 开始观看。
    watcher.EnableRaisingEvents = true;


    // 定义事件处理程序。
    私有静态无效 OnChanged(对象源,FileSystemEventArgs e)
    {
    // 指定更改、创建或删除文件时执行的操作。
    }

    私有静态无效 OnRenamed(对象源,RenamedEventArgs e)
    {
    // 指定重命名文件时要执行的操作。
    }
于 2008-09-21T22:11:42.063 回答
2

我认为您想要的由FileSystemWatcher类提供。

本教程描述了如何使用它来监视一个简单的 Windows 服务中的目录更改;如何在 C# 中实现一个简单的 filewatcher Windows 服务

于 2008-09-21T21:58:07.633 回答
1

嗯……有趣的问题。最初,我会将您指向FileSystemWatcher类。但是,如果您要让它在用户请求时工作,那么您可能需要最初存储目录信息,然后在每次用户请求时进行比较。我可能会使用 FileSystemWatcher 并无论如何都存储您的结果。

于 2008-09-21T21:55:50.167 回答
1

如果您只需要它来检查用户何时询问而不是一直检查,请不要使用 FileSystemWatcher。特别是如果它是一个共享资源——你最不想要的就是 50 台客户端机器观看同一个共享目录。

这可能只是一个错字,但您不应该查看文件访问时间,而应该查看文件修改时间以获取更改。即使这样也不可靠。

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

一个更重的解决方案是反其道而行之,并在托管共享驱动器的机器上安装一项服务,该服务可以监控文件并记录更改。然后你可以查询服务而不是触摸文件——但这可能有点过头了。

于 2008-09-22T03:56:15.167 回答