在previous question我的一个问题中,我的应用程序如何知道文件已被重写。我应该添加:"由另一个应用程序"。首先,我尝试ShellNotify报告目录中的更改,但不报告特定文件中的更改,我是否遗漏了某些内容?
现在我在一个计时器中使用FileAge,每秒检查特定文件是否已更改。虽然这有效但它检测到两个修改,相隔约13毫秒;当我将测试间隔更改为10秒时,此行为仍然存在。下面的代码是计时器的回调。
procedure TAMI_Column_Selector.doWork (Sender: TObject);
var new_stamp: TDateTime;
begin
if FileAge (remove_extension (FileName) + '.csv', new_stamp) then
begin
if (new_stamp <> FDateTimeStamp) then
begin
FDateTimeStamp := new_stamp;
FTask.SyncCall (notify_user);
end; // if
end; // if
end; // doWork //
我的问题:
notify_user
在上面的代码中被调用两次?一个愚蠢的错误或文件系统的一些奇怪的行为(例如修改日期是在打开和关闭文件时设置的)?更新
David Heffeman的答案(使用ReadDirectoryChangesW
而不是轮询)是问题2的正确答案。但是,在一次修改(从用户的角度来看)中,它也会导致多次调用,如上所述问题1。
我比较了ReadDirectoryChangesW
和投票方法。测试了两个文件(0.5MB和10 MB)。在这两种情况下,轮询方法一直被调用两次,ReadDirectoryChangesW
被调用几次(3到5次)。我将恢复轮询方法并忽略第一个FileAge
更改。我知道我无法确定这种行为是否一致,因为我不了解导致它的机制。