http://www.perlmonks.org?node_id=872099


in reply to Re: File::Monitor problem with batch files
in thread File::Monitor problem with batch files

Thank you very much! I have setup the win32::readdirectorychangesw module on my hard drive by copying the pm file to the directory of perl. i tried the following code as you told me:

use strict; use warnings; use File::Copy::Recursive qw(fcopy rcopy dircopy fmove rmove dirmove); use Win32::ReadDirectoryChangesW; my $path = 'c:\\PAPER'; my $subtree = 1; my $filter = FILE_ACTION_ADDED | FILE_ACTION_MODIFIED; my $rdc = Win32::ReadDirectoryChangesW->new(path => $path, subtree => 1, filter => $filter); my @results = $rdc->read_changes; while (scalar @results) { my ($action, $filename) = splice(@results, 0, 2); if ($action == FILE_ACTION_ADDED || $action == FILE_ACTION_MODIFIED +) { # perform your backup here fcopy ("$filename","p:\\phdpaper"); } }

But i got a wrong message: Bareword "FILE_ACTION_ADDED" not allowed while "strict subs" in use at C:\PAPER\1.pl line 9. Bareword "FILE_ACTION_MODIFIED" not allowed while "strict subs" in use at C:\PAPER\1.pl line 9. Bareword "FILE_ACTION_ADDED" not allowed while "strict subs" in use at C:\PAPER\1.pl line 21. Bareword "FILE_ACTION_MODIFIED" not allowed while "strict subs" in use at C:\PAPER\1.pl line 21. Execution of C:\PAPER\1.pl aborted due to compilation errors.

Then i delete the "use strict" script, runing...., but still got the following error: Can't locate object method "new" via package "Win32::ReadDirectoryChangesW" (perhaps you forgot to load "Win32::ReadDirectoryChangesW"?) at C:\PAPER\1.pl line 11.

So, can you help me figure out what the problem was? Thanks a lot!

Replies are listed 'Best First'.
Re^3: File::Monitor problem with batch files
by tokpela (Chaplain) on Nov 18, 2010 at 02:58 UTC

    Actually, I looked at the module and the package name is

    package Win32::ReadDirectoryChanges;

    The bareword errors were probably because of the incorrect package name. Change the name of the module you copied and pasted to Win32::ReadDirectoryChanges (without the W).

    Try to change the code to:

    use strict; use warnings; use File::Copy::Recursive qw(fcopy rcopy dircopy fmove rmove dirmove); use Win32::ReadDirectoryChanges; my $path = 'c:\\PAPER'; my $subtree = 1; my $filter = FILE_ACTION_ADDED | FILE_ACTION_MODIFIED; my $rdc = Win32::ReadDirectoryChanges->new(path => $path, subtree => 1, filter => $filter); my @results = $rdc->read_changes; while (scalar @results) { my ($action, $filename) = splice(@results, 0, 2); if ($action == FILE_ACTION_ADDED || $action == FILE_ACTION_MODIFIED +) { # perform your backup here fcopy ("$filename","p:\\phdpaper"); } }

      I have tried other filters like:

      FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_ACTION_MODIFIED

      But they all work not well, I m trying the other filters.

      I also got a wrong message when I ran the code you post to me:

      Character in 'C' format wrapped in pack at c:/Perl/site/lib/Win32/ReadDirectoryChanges.pm line 214.

      I don't know how to treat it. I really want the code to work, it will be a great help to my paper composition.

      Thanks!

      Thanks! But it just work on the tmp file, which was automatically added after i saved a .doc file by microsoft word, but there was no copying action for the original .doc file after i modified it and saved.

      Whats wrong? Pleas hint.

      How do you think the problem i asked for you? Actually, i tried the following codes using the file::monitor::delta package, finally, it worked very well!

      use File::Monitor; use File::Copy::Recursive qw(fcopy rcopy dircopy fmove rmove dirmove); my $monitor = File::Monitor->new(); # Watch some files for my $file (qw( 1.doc 2.xls)) { $monitor->watch( $file ); } # First scan just finds out about the monitored files. No changes # will be reported. #$object->scan; while (1) { $monitor->scan; sleep 10; # After the first scan we get a list of File::Monitor::Delta objec +ts # that describe any changes my @changes = $monitor->scan; for my $change (@changes) { # Call methods on File::Monitor::Delta to discover what change +d if ($change->is_mtime) { my $name = $change->name; my $old_mtime = $change->old_mtime; my $new_mtime = $change->new_mtime; print "$name changed at $new_mtime\n"; fcopy ("$name","p:\\phdpaper"); #backup automatically for +the file which just has been modified } } }

      Thank you for your help!