如何在没有持续扫描的情况下检测目录或文件的更改时间

时间:2010-07-09 18:48:05

标签: c# windows file filesystems directory

除了读取所有文件并将它们与之前的快照进行比较之外,有没有办法检测C#目录在Windows中的变化?我不介意PInvoke,如果这就是它。

编辑 FileSystemWatcher类非常棒,但有一个问题是你必须将回调通知中的任何工作都放到后台任务/线程中,以避免阻塞导致丢弃的事件。

2 个答案:

答案 0 :(得分:30)

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

来自doc:

  

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

     

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

     

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

     

你可以留意重命名,删除,   或创建文件或目录。   例如,要注意重命名   文本文件,将Filter属性设置为   “* .txt”并调用WaitForChanged   为指定的重命名方法   它的参数。

答案 1 :(得分:5)

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

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

如果您要对文件做任何事情,那么您可能需要小心。