【问题标题】:How do I detect when a directory or file changes without constant scanning如何在没有持续扫描的情况下检测目录或文件何时更改
【发布时间】:2011-03-14 00:54:25
【问题描述】:

除了读取所有文件并将它们与以前的快照进行比较之外,还有没有办法在 Windows 中检测 C# 中的目录何时更改?如果需要的话,我不介意 PInvoke。

编辑 FileSystemWatcher 类很棒,但有一个问题是您必须在后台任务/线程的回调通知中启动任何工作,以避免阻塞导致事件丢失。

【问题讨论】:

    标签: c# windows file filesystems directory


    【解决方案1】:

    我必须为一个程序执行此操作,该程序将监视目录并查看是否添加了任何新图像文件,然后它会自动调整它们的大小。当有人一次添加多个文件时,观察者不会捕获所有文件,因为它是单线程的,并且正在忙着调整一个图像的大小而另一个正在被删除。

    我必须把它做成一个多线程应用程序,其中主线程只是监视目录并将文件添加到队列中,另一个线程将从队列中读取并调整这些图像的大小。

    如果您要对文件执行任何操作,您可能需要注意这一点。

    【讨论】:

    • 是的,我肯定会为我将要执行的每个文件操作生成一个线程池线程,感谢您的提示!
    【解决方案2】:

    使用 FileSystemWatcher 类 - 它可以满足您的需求。它不会告诉您文件中的哪些字节发生了更改,但它会告诉您哪些文件发生了更改。

    来自文档:

    使用 FileSystemWatcher 监视 指定目录的变化。你 可以观察文件的变化和 指定的子目录 目录。您可以创建一个组件 观看本地计算机上的文件, 网络驱动器或远程计算机。

    要监视所有文件中的更改,请设置 Filter 属性为空字符串 ("") 或使用通配符 (".")。到 观看特定文件,设置过滤器 文件名的属性。为了 例如,观察变化 文件 MyDoc.txt,设置过滤器 属性为“MyDoc.txt”。你也可以 观察某种类型的变化 文件。例如,要监视 文本文件的更改,设置过滤器 属性为“*.txt”。

    您可以进行多种类型的更改 可以在目录或文件中观察。 例如,您可以观察变化 在属性中,LastWrite 日期和 时间,或文件大小或 目录。这是通过设置完成的 NotifyFilter 属性为其中之一 NotifyFilters 值。更多 有关您更改类型的信息 可以看,见NotifyFilters。

    您可以观看重命名、删除、 或创建文件或目录。 例如,要监视重命名 文本文件,将 Filter 属性设置为 "*.txt" 并调用 WaitForChanged 指定了重命名的方法 它的参数。

    【讨论】:

    • 它通常会告诉您哪些文件有更改。我已经测试过了。在重负载下它不是 100%。
    • 在实施过程中还有很多“陷阱”需要注意。确保您彻底阅读了所有文档。发生错误时,您可能需要不时重新初始化观察程序。
    • FileSystemWatcher 会显示哪些文件被哪个程序更改(即检测何时使用记事本编辑example.txt)?
    猜你喜欢
    • 2011-11-23
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    相关资源
    最近更新 更多