Thu May 17 16:28:49 2012: Request 77261 was acted upon.
Transaction: Correspondence added by CJM
       Queue: Win32-IPC
     Subject: Win32::ChangeNotify always watches subtree
   Broken in: (no value)
    Severity: Unimportant
       Owner: Nobody
  Requestors: david.zh...@bowker.com
      Status: new
 Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=77261 >


This turns out to be a problem with the underlying
FindFirstChangeNotification API.  There's nothing I can do about it.

Here's the program I used to test it:

  use 5.010;
  use strict;
  use warnings;
  use Win32::ChangeNotify;

  my $notify = Win32::ChangeNotify->new(".", 0, # no subtree
                                        'FILE_NAME DIR_NAME LAST_WRITE');

  say 'waiting...';

  while ($notify->wait) {
    say "change!";
    $notify->reset;
  }

I ran that script, and then in another console created & removed files
in the watched directory and subdirectories of it.  I sometimes got a
notification when changing files in a subdirectory (although not all the
time).

I verified that it's a Windows bug by running the equivalent C program,
which gave similar results:

  #define WIN32_LEAN_AND_MEAN
  #include <windows.h>
  #include <stdio.h>

  int main(int argc, char* argv[])
  {
    HANDLE cn = FindFirstChangeNotification(".", FALSE,
                                            FILE_NOTIFY_CHANGE_FILE_NAME |
                                            FILE_NOTIFY_CHANGE_DIR_NAME |
                                            FILE_NOTIFY_CHANGE_LAST_WRITE );

    puts("waiting");

    while (WaitForSingleObject(cn, INFINITE) == WAIT_OBJECT_0) {
      puts("change!");
      FindNextChangeNotification(cn);
    }

    return 0;
  } /* end main */

Reply via email to