跟踪对 Delphi 中的文件夹所做的更改

发布于 2024-08-11 01:12:49 字数 114 浏览 2 评论 0原文

我需要编写一个 Delphi 程序来监视文件夹的更改(添加、更新、重命名和删除文件)。

我看到了使用 TShellChangeNotifier 的建议。这是这个问题的正确解决方案吗?我应该如何使用它?

I need to writing a Delphi program which will monitor a folder for changes (add, update, rename and removal of files).

I have seen suggestions to use theTShellChangeNotifier. Is this the correct solution for this problem? How should I use it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

温柔戏命师 2024-08-18 01:12:49

这个问题可能会有所帮助。 mghie 的答案展示了如何正确使用 ReadDirectoryChangesW

This question might help. mghie's answer shows how to properly use ReadDirectoryChangesW.

思慕 2024-08-18 01:12:49

我认为这篇文章会对您有所帮助:使用 Delphi 监视系统 Shell 更改

基本上它会分析 TShellChangeNotifier,丢弃它,然后寻找 TSHChangeNotify,它基本上是 SHChangeNotify windows api 函数。

I think this article will help you: Monitoring System Shell Changes using Delphi

Basically it analyzes the TShellChangeNotifier, discards it and then goes for a TSHChangeNotify which is basically a wrapper for the SHChangeNotify windows api function.

你丑哭了我 2024-08-18 01:12:49

我建议使用 madShell

RegisterShellEvent(ShellEvent, pathToMonitor, false, [seItemCreated, seItemRenamed]);

//

procedure Tform.ShellEvent(event: TShellEventType; const obj1, obj2: IShellObj; drive: char; value: cardinal);
var
  filename: string;
  isReady: boolean;
begin
  if (event = seItemCreated) then
    filename := obj1.Path
  else if (event = seItemRenamed) then
    filename := obj2.Path
  else
    exit;

  // try to open to ensure it's read for reading
  repeat
    try
      TfileStream.Create(filename, fmOpenRead + fmShareExclusive).Free;
      isReady := true;
    except
      isReady := false;
      sleep(250);
    end;
  until (isReady) or (not FileExists(filename));

  OutputDebugString(pChar('ShellEvent: ' + filename));

end;

i suggest using madShell

RegisterShellEvent(ShellEvent, pathToMonitor, false, [seItemCreated, seItemRenamed]);

//

procedure Tform.ShellEvent(event: TShellEventType; const obj1, obj2: IShellObj; drive: char; value: cardinal);
var
  filename: string;
  isReady: boolean;
begin
  if (event = seItemCreated) then
    filename := obj1.Path
  else if (event = seItemRenamed) then
    filename := obj2.Path
  else
    exit;

  // try to open to ensure it's read for reading
  repeat
    try
      TfileStream.Create(filename, fmOpenRead + fmShareExclusive).Free;
      isReady := true;
    except
      isReady := false;
      sleep(250);
    end;
  until (isReady) or (not FileExists(filename));

  OutputDebugString(pChar('ShellEvent: ' + filename));

end;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文