如何检测文件的正确修改?

时间:2012-04-12 14:18:04

标签: delphi windows-7 file-io delphi-xe datemodified

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 //

我的问题:

  1. 究竟是什么导致notify_user在上面的代码中被调用两次?一个愚蠢的错误或文件系统的一些奇怪的行为(例如修改日期是在打开和关闭文件时设置的)?
  2. 感觉有点浪费&#34;每秒检查文件是否已更改。有没有类似ShellNotify的东西只在特定文件被修改时通知我?
  3. 更新

    David Heffeman的答案(使用ReadDirectoryChangesW而不是轮询)是问题2的正确答案。但是,在一次修改(从用户的角度来看)中,它也会导致多次调用,如上所述问题1。

    我比较了ReadDirectoryChangesW和投票方法。测试了两个文件(0.5MB和10 MB)。在这两种情况下,轮询方法一直被调用两次,ReadDirectoryChangesW被调用几次(3到5次)。我将恢复轮询方法并忽略第一个FileAge更改。我知道我无法确定这种行为是否一致,因为我不了解导致它的机制。

1 个答案:

答案 0 :(得分:2)

我知道这不是您问题的直接答案,但我建议您使用ReadDirectoryChangesW而非投票。