【问题标题】:What does it mean `bWatchSubtree` parameter of the `FindFirstChangeNotification` function?`FindFirstChangeNotification` 函数的`bWatchSubtree` 参数是什么意思?
【发布时间】:2021-01-18 20:33:09
【问题描述】:

我想用FindFirstChangeNotification监视一个文件夹,我不明白bWatchSubtree参数的含义。 “子树”是什么意思?是指被监控文件夹的子文件夹,还是指从被监控文件夹到盘符的父文件夹?

微软说:

如果该参数为TRUE,函数监控目录树 植根于指定目录;如果为 FALSE,则仅监视 指定目录。

假设我们有以下路径:D:\Software\Programming\Delphi\RADStudio

如果我监控“D:\Software\Programming”并且该参数是True,除了“Programming”之外,我还会收到哪些文件夹的通知? (软件)还是(Delphi 和 RADStudio)?

我做了一些测试,但当我更改“Delphi 或 RADStudio”文件夹中的某些内容时,我没有收到任何通知。但是如果我删除“软件”文件夹,我会收到通知。如果我想改名,系统不让我,很郁闷。我希望在监视文件夹时能够对文件和文件夹进行任何操作。如果我更改其中一个父文件夹的名称,最好通知我并停止观看该文件夹...

【问题讨论】:

  • “以文件夹为根的子树”肯定是指该文件夹及其下任何级别的所有子目录。这是数学意义上的subtree
  • @AndreasRejbrand 在我的情况下,我会收到“Delphi 和 RADStudio”文件夹的通知?因为我没有得到任何...
  • “编程”、“Delphi”和“RADStudio”,是的。以及根目录的任何其他后代。我有点短视,因此我无法在林雪平公寓看到您屏幕上的代码,所以我无法真正说出问题所在。

标签: api delphi directory monitoring


【解决方案1】:

文件系统是数学上的tree以目录为根的子树因此意味着由该目录及其所有后代组成的子树,即任何级别的所有子目录。

例如,

                          C:\
                           │
           ┌───────────────┴──────────────┐
        Letters                        Pictures
           │                              │
  ┌────────┴────────┐            ┌────────┴────────┐
Family             Work         Cats              Dogs
                                                   │
                                          ┌────────┴────────┐
                                        Small              Large

Pictures为根的子树由PicturesCatsDogsSmallLarge组成,而以Dogs为根的子树由DogsSmall组成和Large

我刚刚试了一下,根据这个解释,FindFirstChangeNotification 函数及其bWatchSubtree 参数确实按预期工作。

我使用以下非常快速而肮脏的代码来测试:

procedure TForm1.FormCreate(Sender: TObject);
var
  h: THandle;
begin
  h := FindFirstChangeNotification('C:\Pictures', True, FILE_NOTIFY_CHANGE_FILE_NAME);
  if h = INVALID_HANDLE_VALUE then
    RaiseLastOSError;
  TThread.CreateAnonymousThread(
    procedure
    begin
      while True do
        if WaitForSingleObject(h, INFINITE) = WAIT_OBJECT_0 then
        begin
          OutputDebugString('Yes!');
          FindNextChangeNotification(h);
        end;
    end
  ).Start
end;

如果我重命名任何图片,我会收到Yes! 消息。无论是狗还是猫的照片,或者狗的大小,都没有关系。使用bWatchSubtree = False,我只会在Pictures 文件夹中的文件重命名 时收到通知。未检测到重命名狗或猫图片。

【讨论】:

  • 确实如此。我的代码有问题...谢谢!
  • @MarusNebunu:没问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 2020-05-15
  • 1970-01-01
  • 2013-07-07
  • 2020-12-16
相关资源
最近更新 更多