in reply to Re^5: ignore list of files using readdir function
in thread ignore list of files using readdir function

My requirement is to check if a new file comes into IN folder, with a maximum delay of 15 minute same file with _ACK.xml is present in the OUT Directory or not?

for example a01.xml comes in the folder IN, this will be processed by the application and sent it to OUT folder after processing (maximum time of processing is 15 minute) as a01_ACK.xml.

Content is not important in this case. in windows i can use WMI to to check if new file is created in IN directory (instance created) and then check for the same in OUT folder but in UNIX i can not get such trigger so i had to choose the way of comparing files but i am not much into UNIX so cant think other than this.

-KAKA-

  • Comment on Re^6: ignore list of files using readdir function

Replies are listed 'Best First'.
Re^7: ignore list of files using readdir function
by mtmcc (Hermit) on Jul 23, 2013 at 12:13 UTC
    Does this do what you want?:

    #! /usr/bin/perl use strict; use Math::BigFloat; Math::BigFloat->precision(0); sub GetINDirFiles { my @files; my ($path) = $_[0]; opendir (my $directory, $path) or die $!; while(readdir $directory) { push (@files, $_) unless (($_ =~ m/_ACK_/) || ($_ =~ m +/^\./)); } closedir $directory; return(@files); } sub GetOUTDirFiles { my @files; my ($path) = $_[0]; opendir (my $directory, $path) or die $!; while(readdir $directory) { unless ($_ =~ m/^\./) { push (@files, $_) if $_ =~ m/_ACK.xml/; } } closedir $directory; return(@files); } # Main my @range; my $inpath = "./IN/"; my $outpath = "./INACK/"; my $outsuffix = "_ACK.xml"; my $insuffix = ".xml"; # Added by me my $timethreshold = 900; # set time threshold in seconds (900 se +conds equal 15 minutes) my @delindex; my @infiles = &GetINDirFiles($inpath); my @outfiles = &GetOUTDirFiles($outpath); my $index = 0; # index used to get string position in array my $count = @infiles; for (my $x = 0; $x < $count; $x+= 1) { my $name = $infiles[$x]; $name =~ s/$insuffix//; for (@outfiles) { if ($_ =~ m/$name/) { push (@range, $x) } } } my $rangeCount = @range; for (my $x = 0; $x < $count; $x+= 1) { splice(@infiles, $range[$x], 1); } # remove strings my $currenttime = time; # get current time from system (epoch time) foreach my $file (@infiles) { my $fileForTime = "$inpath"."$file"; my $mtime = ( stat $fileForTime )[9]; my $diff = ($currenttime - $mtime); # ignore directories # INSERT SUFFIX AGAIN ($insuffix) # get mtime from file (epoch time) # INSERT SUFFIX AGAI +N ($insuffix) if ($diff > $timethreshold) { print "\n - file " . $file . " in " . $inpath . " direc +tory was created at more than " . Math::BigFloat->new($diff / 60) . +" minutes."; # INSERT SUFFIX AGAIN ($insuffix) # PUT THE ACTION THAT YOU WANT DO HERE!!! } }

    NOTE: Change the pathnames!
Re^7: ignore list of files using readdir function
by poj (Abbot) on Jul 23, 2013 at 12:37 UTC
    In that case a simpler more direct approach might work for you
    #!perl use strict; my $inpath = "/AAA/BBB/CCC/IN"; my $outpath = "/AAA/BBB/CCC/OUT"; # check inpath files less than 60 mins # and more than 15 mins old my $min_age = 0.25/24; # 15 mins in days my $max_age = 1.00/24; # 1 hour in days my $count =0; my $ignore=0; print "Scanning in dir $inpath .. \n"; opendir DIR, $inpath or die $!; for (readdir DIR){ # skip if not a file next unless (-f "$inpath/$_"); # filter on age my $age = -M "$inpath/$_"; if ( ($age > $min_age) && ($age < $max_age) && ( !/_ACK_/ ) ){ # build outfile name (my $outfile = $_) =~ s/(\.xml)$/_ACK$1/; # check outfile exists if (-e "$outpath/$outfile"){ print "$_ => $outfile exists\n"; } else { print "$_ => $outfile does not exist\n"; } ++$count; } else { ++$ignore; } } closedir DIR; print "$count files checked - $ignore files ignored\n";
    poj
Re^7: ignore list of files using readdir function
by Anonymous Monk on Jul 23, 2013 at 10:51 UTC

    but in UNIX i can not get such trigger so i had to choose the way of comparing files but i am not much into UNIX so cant think other than this.

    Real "UNIX" ? If not you can use Linux::Inotify2

      it is on HP-UX Servers