NAME
Filesys::Notify::Win32::ReadDirectoryChanges - read/watch directory changes
SYNOPSIS
my $watcher = Filesys::Notify::Win32::ReadDirectoryChanges->new();
for my $dir (@ARGV) {
$watcher->watch_directory( path => $dir, subtree => 1 );
};
$watcher->wait(sub {
my( $event ) = @_;
say $event->{action}, ":", $event->{path};
});
This module allows to watch multiple directories for changes and invokes a callback for every change.
This module spawns a thread for each watched directory. Each such thread synchronously reads file system changes and communicates them to the main thread through a Thread::Queue.
METHODS
->new %options
my $w = Filesys::Notify::Win32::ReadDirectoryChanges->new(
directories => \@ARGV,
subtree => 1,
);
Creates a new watcher object.
->queue
my $q = $w->queue;
Returns the Thread::Queue object where the filesystem events get passed in. Use this for integration with your own event loop.
->watch_directory
$w->watch_directory( path => $dir, subtree => 1 );
Add a directory to the list of watched directories.
->unwatch_directory
$w->unwatch_directory( path => $dir );
Remove a directory from the list of watched directories. There still may come in some events stored for that directory previously in the queue.
->wait $CB
$w->wait(sub {
my ($event) = @_;
say $event->{action};
say $event->{path};
});
Synchronously wait for file system events.
EVENTS
The following events are created by ReadDirectoryChangesW resp. this module
- added
-
{ action => 'added', path => 'old-name.example', }
A new file was created
- removed
-
{ action => 'removed', path => 'old-name.example', }
A file was removed
- modified
-
{ action => 'modified', path => 'old-name.example', }
A file was modified
- old_name
-
{ action => 'old_name', path => 'old-name.example', }
First half of a rename
- new_name
-
{ action => 'new_name', path => 'new-name.example', }
Second half of a rename
- renamed
-
Whenever the event old_name is followed immediately by new_name, a third, synthetic event is generated,
renamed
.{ action => 'renamed', path => 'old-name.example', old_name => 'old-name.example', new_name => 'new-name.example', }
GLOBAL VARIABLES
$bufsize
-
local $Filesys::Notify::Win32::ReadDirectoryChanges::bufsize = 1024*1024;
This variable is the buffer for the directory changes that get read from Windows. The default size is 65520 bytes.
HELP WANTED
In theory, this module should also work on Cygwin, but for some reason, it seems that there is memory corruption on Cygwin. If you happen to be handy with a debugger and familiar with Cygwin, your help is appreciated.
SEE ALSO
Filesys::Notify::Simple - simple cross-platform directory watcher
File::ChangeNotify - complex cross-platform directory watcher
Win32::ChangeNotify - Win32 directory watcher using the ChangeNotify API
Currently, no additional information like that available through https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-readdirectorychangesexw|ReadDirectoryChangesExW is collected. But a wrapper/emulation could provide that information whenever RDCE is unavailable (on Windows versions before Windows 10).
REPOSITORY
The public repository of this module is https://github.com/Corion/Filesys-Notify-Win32-ReadDirectoryChanges.
SUPPORT
The public support forum of this module is https://perlmonks.org/.
AUTHOR
Max Maischein corion@cpan.org
COPYRIGHT (c)
Copyright 2022 by Max Maischein corion@cpan.org
.
LICENSE
This module is released under the same terms as Perl itself.