Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re: File::Monitor problem with batch files

by tokpela (Chaplain)
on Nov 17, 2010 at 21:20 UTC ( #872056=note: print w/ replies, xml ) Need Help??


in reply to File::Monitor problem with batch files

There are a couple of options.

One option is to create a thread for each file you want to monitor. If you go this route, check out the Thread::Queue module. You should run a search on this site for many good starting points. BrowserUK has given lots of advise and examples.

A second option is to monitor a directory and then make a copy if you receive an modification event. There is a module Win32::ReadDirectoryChangesW which will tell you which file was modified and allow you to respond. It is a wrapper around the Win32 API ReadDirectoryChangesW. It is not on CPAN but can be found on this site - so you will need to copy and paste the module into your personal library directory.

An short example, pieced from how I have used this module (untested).

use strict; use warnings; use Win32::ReadDirectoryChangesW; my $path = 'c:/directory'; 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 } }

There is also a third option if you have more than one directory which would be to use both methods 1 and 2.


Comment on Re: File::Monitor problem with batch files
Download Code
Re^2: File::Monitor problem with batch files
by xbmy (Friar) on Nov 18, 2010 at 00:30 UTC

    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!

      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"); } }

        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.

        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!

        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!

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://872056]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (8)
As of 2014-08-01 09:29 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (258 votes), past polls