除了读取所有文件并将它们与之前的快照进行比较之外,有没有办法检测C#中的目录何时发生变化?我不介意PInvoke,如果这是它需要的。
编辑FileSystemWatcher类很棒,但有一个问题是你必须将回调通知中的任何工作都放到后台任务/线程中,以避免阻塞导致丢弃的事件。
使用FileSystemWatcher类 - 它可以满足您的需求。它不会告诉您文件中的哪些字节发生了变化,但它会告诉您哪些文件有变化。
来自doc:
使用FileSystemWatcher监视指定目录中的更改。您可以监视指定目录的文件和子目录中的更改。您可以创建一个组件来监视本地计算机,网络驱动器或远程计算机上的文件。
要监视所有文件中的更改,请将Filter属性设置为空字符串(“”)或使用通配符(“。”)。要查看特定文件,请将Filter属性设置为文件名。例如,要监视文件MyDoc.txt中的更改,请将Filter属性设置为“MyDoc.txt”。您还可以查看特定类型文件的更改。例如,要监视文本文件中的更改,请将Filter属性设置为“* .txt”。
您可以在目录或文件中查看多种类型的更改。例如,您可以查看属性,LastWrite日期和时间或文件或目录的大小的更改。这是通过将NotifyFilter属性设置为NotifyFilters值之一来完成的。有关您可以观看的更改类型的更多信息,请参阅NotifyFilters。
您可以观察文件或目录的重命名,删除或创建。例如,要监视文本文件的重命名,请将Filter属性设置为“* .txt”,并使用为其参数指定的Renamed调用WaitForChanged方法。
我必须为一个程序执行此操作,该程序将查看目录并查看是否添加了任何新图像文件,然后它将自动调整它们的大小。当有人一次添加多个文件时,观察者将无法捕获所有文件,因为它是单线程的,并且正在忙于调整一个图像的大小而另一个图像被丢弃。
我不得不把它变成一个多线程的应用程序,主线程只是看了目录并将文件添加到队列中,另一个线程将从队列中读取并调整这些图像的大小。
如果您要对文件做任何事情,那么您可能需要小心。