Delphi在文件更新时的通知

10

我的应用程序包含数据库中的文档。用户可以打开这些文档,此时文档将保存到临时文件夹并在用户的计算机上打开。

我想在这些临时文件被更改时获得通知,并向用户提供将更改后的文档保存回数据库的选项。

在Delphi7中,最简单的方法是什么?(我认为需要一些shell技巧或第三方组件)

谢谢!


文档加载在哪里?TRichEdit?TMemo? - zz1433
5个回答

11
您可以使用来自JEDI JVCL集合的TJvChangeNotify组件检测您的临时文件(或任何文件)的更改。请保留HTML标记:TJvChangeNotify组件和JEDI JVCL集合。

4
我不想使用JVCL组件,因为我发现它们有些buggy。更不用说要安装成千上万个组件才能获得你实际需要的一个组件... - Steve

9

您可以选择:

  1. 使用Win32 API的SHChangeNotifyRegister函数来监视临时文件夹中的更改,然后让回调函数检查您的临时文件是否报告了更改。

  2. 由于您知道您感兴趣的确切文件,因此可以在定时器或线程中使用FindFirstFile直接监视它们的大小和时间戳的更改。


6

除了RRuzRemy Lebeau所写的内容:

请注意,在JvChangeNotify单元中,TJvChangeNotify使用了FindFirstChangeNotification API调用; 这里是MSDN文档。请注意,它有点违反直觉:请参阅下面提到的线程,了解如何在while循环内使用它。

还有一个名为ReadDirectoryChanges的API调用,它没有被JCL/JVCL包装,MSDN文档在这里,同时也有一个Delphi win32示例

这个线程解释了这两个API调用之间的区别。

--jeroen


谢谢提供的信息,我也会去查看一下。 - Steve

2

请注意该库中存在一个错误。您需要在TDirWatchThread.Execute中添加Terminate(在SignalError(ErrorMessage)之后)- 如果没有这个,当您从文件夹中删除所有文件然后删除文件夹时,它会进入无限循环!重现此错误的步骤:创建文件夹,监视文件夹,将文件放入文件夹中,从文件夹中删除所有文件,删除文件夹,应用程序冻结。 - Gabriel

0
这是一种简单的方法,使用JEDI JVCL的复杂组件来监视目录。
  1. 将组件放置在主窗体上。
  2. 单击其通知属性。
  3. 编辑JvChangeNotify1.Notifications对话框中,单击添加新项图标。
  4. 关闭对话框。
  5. 在事件选项卡上,双击OnChangeNotify
  6. 编写代码以实现文件夹更改时要执行的操作。
  7. 在主窗体的Create过程中,添加以下代码:

    var rJvChangeItem:= JvChangeNotify1.Notifications[0];
    rJvChangeItem.Directory:= [the folder you want to monitor - string];
    JvChangeNotify1.Active:= True;
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接