2011-04-23 32 views

回答

4

去年我有同样的需要,并尝试了Iztok Kacin的目录观察:http://www.cromis.net/blog/downloads/directory-watch/。他回复了电子邮件,对回答我的问题非常有帮助。

他的代码工作,但我需要的时刻被通知的文件中的特定文件夹中关闭,这对于微软一些奇怪的原因,ReadDirectoryChanges API(它依赖)(令人恼火)没有按”提供。我似乎也记得Iztok的代码使用了线程,并且没有足够的轻量级来满足我的需求。

我最终使用了一种令人惊讶的简单方法,它对我来说非常有效。在每隔几秒钟触发的TTimer事件中,我在我正在监视的文件夹上使用FindFirst。所有找到的文件都放在一个持久的TStringList中。任何发现的文件都不在以前的TTimer事件的StringList中。 (要检测一个文件是否关闭,我尝试以独占模式打开该文件,如果我无法打开它,则不会将它添加到TStringList,因此它会在下一个事件中进行检查。)

我很安静犹豫使用这种方法,认为这太蛮力。但是,为了满足我的需求,这个解决方案出色地完成了,并且非常幸运,只涉及少量非常简单的代码,这些代码很容易理解和维护。

HTH

+0

为什么有人在我的答案上面投了票? – RobertFrank 2011-04-24 13:20:05

+0

谁知道?......实际上这很烦人。由于解决方案有效,所以需要+1进行补偿 – yms 2011-05-03 00:00:33

+0

请注意,该库存在一个小错误。您需要在TDirWatchThread.Execute中添加Terminate(在SignalError(ErrorMessage)之后) - 如果没有它,当您从文件夹中删除所有文件时,会进入无限循环,然后是文件夹本身! – Ampere 2017-04-22 10:30:49