dirg3.pl to HTML.

index -|- end

Generated: Tue Feb 2 17:54:30 2010 from dirg3.pl 2008/07/22 29.3 KB.

#!/Perl
# AIM: Scan a directory, and suggest CD-ROM write
# limits ... fill CD-ROM to below ORANGE(warn) level
# by skipping FOLDER that put it OVER this limit.
# Present limit = 700MB CD-ROM assumed, so
# LIMIT set to 650MB ...
# sort per FOLDER size
# add oldest/youngest columns
# adjust to sector sizing
# Three examples
# CD1 - 547 files, 8 dirs, 24 folders, total 647,451,959 bytes - 618MB, 316,625 sectors
# CD2 - 588 files, 9 dirs, 27 folders, total 617,984,758 bytes - 590MB, 302,262 sectors
# CD3 - 416 files, 5 dirs, 15 folders, total 446,700,056 bytes - 427MB, 218,623 sectors
use strict;
use Cwd;
use File::stat;
require "logfile.pl" or die "Missing logfile.pl ...\n"; # my simple log file and some other utility subs
my $start_time = time();
my $def_file = "C:\\Users\\Public\\SAVES\\peru\\My Pictures\\Carla";   # DEFAULT, if NO command input
###my $def_file = "C:\\HOMEPAGE";   # DEFAULT, if NO command input
my $block = 2048;   # was 512;
my @mths = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
my $program = 'dirg3.pl';
my $max_cd = 650 * 1024 * 1024; # set at 650MB
my $out_name = 'tempdgpl.htm';
my $load_txt = 1;
my $load_htm = 1;
my $use_est = 1;   # use calculated total
my $cwdir = getcwd();
my $tot_all = 0;
my $tot_sub = 0;
my $no_max = 0; # set failed on FIRST - no more checking
my $had_sub = 0; # count of SUB-TOTALS issued
my $shwtm = 1;
my @in_files = (); # list of input folders
# degbug items
my $verbose = 0;
my $verb2 = 0;
my $verb3 = 0;
my $dbg = 0;
my $dbg1 = 0;   # show "Set last line = TOTALS ...
my $dbg2 = 0;   # show "Creating $out_name, with table of $row_count rows ...
my $dbg3 = 0;   # show "Done table 1 - found order ...
my $dbg4 = 0;   # show "Processing folder [$dir] ...
my $dbg5 = 1;   # show "Sub-Total: ($tot_sub + $sub_tot) > $max_cd - inserting sub-total ...
my $dbg6 = 0;   # show "Processing sub-folder [$dir] ... level $level
my $dbg7 = 0;   # show "Returning $tsz (".b2ks2($tsz).") for ".subactdir($dir).", but est is $estsiz ".b2ks2($estsiz)."...
my $fullname = 0;
my $actdir = '';
my $in_file = '';
my $tot = 0;
my $tot_dirs = 0;
my $tot_files = 0;
my $g_tot_dirs = 0;
my $g_tot_files = 0;
my $msg;
my $hdrs = "";
my $tab_width = 600;
my $row_count;
my $cdnum = 1;
my ($g_lowtm,$g_hitm);
# overall times
my $gt_lowtm = time();
my $gt_hitm = 0;
my $dbgtml = 0;
my $dbgtmh = 0;
my $mintime = 10000;   # avoid files set EARLIER than THIS!!!
my $mt = 0;
my $mincnt = 0;   # count of those BELOW this value
my @rows  = (); # hold the FINAL table ROWS x COLS
my @rows2 = (); # inserted in SIZE order, into 'columns'
my @excl_dir = ("Temporary Internet Files"); # should these be EXCLUDED???
my @undefd = (); # seems we need to 'skip' some, quietly
my @colors = qw(red blue green yellow orange purple violet);
for my $name (@colors) {
   no strict 'refs';       # allow symbol table manipulation
    *$name = *{uc $name} = sub { "<font color='$name'>@_</font>" };
}
# log file stuff
my ($LF);
my $outfile = 'temp'.$0.'.txt';
open_log($outfile);
if (@ARGV) {
   parse_arguments(@ARGV);
} else {
   #$verbose = 1;
   #$verb2 = 1;
   push(@in_files, $def_file);
}
prt( "$program: Started on " . localtime($start_time) . " in $cwdir ...\n" ) if $shwtm;
mydie( "$program: no input files found or specified\n" ) if ! @in_files;
# show count in the array ...
#prt ("Processing " . $#in_files + 1 . " directories ...\n") if $verbose;
prt ("Processing " . scalar @in_files . " directories ...\n") if $verbose;
prt( "Init Low-Time ".(scalar localtime $gt_lowtm)."($gt_lowtm)\n" ) if ($dbgtml);
prt( "Init Hi-Time  ".(scalar localtime $gt_hitm)."($gt_hitm)\n" ) if ($dbgtmh);
foreach $in_file (@in_files) {
   $actdir = retfulldir($in_file);
   if (length($hdrs)) {
      $hdrs .= "|";
   }
   $hdrs .= $actdir;
   prt ("Processing [$in_file], as [$actdir] ... moment ...\n") if ($in_file ne $actdir);
   $tot += do_user_dir($actdir);
}
prt( "Totals: $tot bytes, in $g_tot_dirs folders, $g_tot_files files ...\n" );
#prt( "$program: Got ". red($tot) . " bytes, in $tot_dirs folders, $tot_files files ...\n");
mydie( "No table rows to write to $out_name ...\n" ) if ! @rows;
prt( "Set last line = TOTALS ...\n" ) if ($dbg1);
$msg = ("Totals|$tot|$g_tot_dirs|$g_tot_files");
$msg .= "|".date_string(scalar localtime $gt_lowtm);
$msg .= "|".date_string(scalar localtime $gt_hitm);
push(@rows,$msg);
prt("$msg\n");
$row_count = scalar @rows;
# write HTML file
prt( "Creating $out_name, with table of $row_count rows ...\n" ) if ($verbose || $dbg2);
open(DSP, ">$out_name") || mydie( "Can not create $out_name: $!\n" );
#html_head(\*DSP, $hdrs);
html_head2(\*DSP, $hdrs);
print DSP "<p>Maximum CD/DVD size set to ".b2ks2($max_cd)." (was ".b2ks1($max_cd).")<br><b>Table in read/found order</b></p>\n";
print DSP "<p class='ctr'>\n";
#print DSP "<TABLE>\n";
#print DSP "<TABLE class=sbfixed border=\"1\" width=\"" . $tab_width . "\">\n";
print DSP "<table class=sbfixed border=\"1\">\n";
# column              0                                    1                                     2                              3
print DSP "<tr><td><b>Folders</b></td><td align='right'><b>Bytes</b></td><td align='right'><b>Dirs</b></td><td align='right'><b>Files</b></td>\n";
# column          4                  5
print DSP "<td><b>Low Time</b><td><b>Hi-Time</b></td></tr>\n";
my $rcnt = 0;
my $ccnt = 0;
my $bold_row = 0;
$g_lowtm = time();
$g_hitm = 0;
foreach $msg (@rows) {
   $rcnt++;
   print DSP "<tr>\n";
   $ccnt = 0;
   $bold_row = 0; # start as NOT a bold row
   my (@mcols) = split( /\|/, $msg);
   foreach my $col (@mcols) { # process EACH column
      if($rcnt == $row_count) { # ***LAST ROW*** 
         $bold_row = 1; # set BOLD ROW
      }
      if ($ccnt) {
         if ($ccnt == 1 ) { # 2nd column
            ###$msg = addcolmr( b2ks1($col) );
            $msg = b2ks2($col);
         } elsif ($ccnt > 3) {
            # scalar localtime $sb->mtime
            if ($bold_row > 0) {
               if ($ccnt == 4) {
                  $msg = date_string(scalar localtime $g_lowtm);
               } elsif ($ccnt == 5) {
                  $msg = date_string(scalar localtime $g_hitm);
                  # reset times
                  $g_lowtm = time();
                  $g_hitm = 0;
               }
            } else {
               $msg = date_string(scalar localtime $col);
               if ($ccnt == 4) {
                  if ($col < $g_lowtm) {
                    $g_lowtm = $col;
                  }
               } else {
                  if ($col > $g_hitm) {
                    $g_hitm = $col;
                  }
               }
            }
         } else {
            ###$msg = addcolmr( get_nn($col) );
            $msg = get_nn($col);
         }
         if ($bold_row > 0) {
            $msg = addbold( $msg );
         }
         $msg = addcolmr( $msg ); # add the <td align="right"> ... </td>
      } else { # is FIRST column = TEXT
         if ($col =~ /^Sub-Total/i) {
            $bold_row = 1; # set BOLD for each COLUMN
            ###$msg = addcolm( addbold( $col ) );
            $msg = $col;
         } else {
            ###$msg = addcolm( $col );
            $msg = $col;
         }
         if ($bold_row > 0) {
            $msg = addbold( $msg );
         }
         ###$msg = addcolm( $col );
         $msg = addcolm( $msg ); # add the <td> ... </td>
      }
      print DSP "$msg\n"; # shove it out the the HTML file
      $ccnt++;
   }
   print DSP "</tr>\n";
}
print DSP "</table>\n";
print DSP "</p>\n";
prt( "Done table 1 - found order ...\n" ) if ($dbg3);
if (scalar @undefd > 0) {
   print DSP "<p>Skipped following ...<br>\n";
   foreach $msg (@rows) {
      print DSP "$msg<br>\n";
   }
   print DSP "</p>\n";
} else {
   print DSP "<p>NONE skipped ...</p>\n";
}
if ($mincnt) {
   print DSP "<p>Note: There was/were $mincnt file(s) with a date earlier than ".(scalar localtime $mintime)."!</p>\n";
}
#my @sarr = sort( mycmp($a,$b), @rows2 );
my @sarr = sort mycmp_ascend @rows2;
my $cnt = scalar @sarr;
print DSP "<p><b>Ascending Table</b></p>\n";
out_sort_table();
@sarr = sort mycmp_decend @rows2;
$cnt = scalar @sarr;
print DSP "<p><b>Descending Table</b></p>\n";
out_sort_table();
print DSP "<p>Text results written to <a href='$outfile'>$outfile</a></p>\n";
html_tail(\*DSP);
close(DSP);
prt( "$program: Ended on " . localtime(time()) . ".\n" ) if $shwtm;
prt( "Results written to $out_name ...\n" );
close_log($outfile,$load_txt);
system( $out_name ) if ($load_htm); # start HTML file
exit(0);
##################################
# end of program
#################################
### subs
#################################
sub out_sort_table {
   prt( "Outputting sorted table ...\n" );
print DSP "<p class=\"ctr\">\n";
#print DSP "<TABLE>\n";
#print DSP "<TABLE class=sbfixed border=\"1\" width=\"" . $tab_width . "\">\n";
print DSP "<table class=\"sbfixed\" border=\"1\">\n";
print DSP "<tr>\n";
print DSP "<td><b>CD</b></td>\n";
print DSP "<td><b>Folders</b></td>\n";
print DSP "<td align=\"right\"><b>Bytes</b></td>\n";
print DSP "<td align='right'><b>Dirs</b></td>\n";
print DSP "<td align='right'><b>Files</b></td>\n";
print DSP "<td><b>Low-Time</b></td>\n";
print DSP "<td><b>Hi-Time</b></td>\n";
print DSP "</tr>\n";
my $gtbyts = 0;
my $gtdirs = 0;
my $gtfils = 0;
my $stbyts = 0;
my $stdirs = 0;
my $stfils = 0;
my $lotime = time();
my $hitime = 0;
my $tlotime = time();
my $thitime = 0;
my $lt = 0;
my $ht = 0;
my $ltt = '';
my $htt = '';
$cdnum = 1;
for (my $i = 0; $i < $cnt; $i++) {
   $lt = $sarr[$i][4];
   $ht = $sarr[$i][5];
   $ltt = scalar localtime $lt;
   $htt = scalar localtime $ht;
   if (($stbyts + $sarr[$i][0]) > $max_cd) {
      # time of a sub-total
      #$msg = ("Sub-Total|$tot_sub|$g_tot_dirs|$g_tot_files");
      if ($stbyts + $stdirs + $stfils) {
         print DSP "<tr>\n";
         print DSP "<td>".addbold($cdnum)."</td>\n";
         print DSP "<td>".addbold("Sub-Total")."</td>\n";
         print DSP "<td align='right'>".addbold(b2ks2($stbyts))."</td>\n";
         print DSP "<td align='right'>".addbold(get_nn($stdirs))."</td>\n";
         print DSP "<td align='right'>".addbold(get_nn($stfils))."</td>\n";
         print DSP "<td>".addbold(date_string(scalar localtime $lotime))."</td>\n";
         print DSP "<td>".addbold(date_string(scalar localtime $hitime))."</td>\n";
         print DPS "</tr>\n";
         $cdnum += 1;
      }
      $stbyts = 0;
      $stdirs = 0;
      $stfils = 0;
   }
   print DSP "<tr>\n";
   print DSP "<td>$cdnum</td>\n";
   print DSP "<td>".$sarr[$i][1]."</td>\n";
   print DSP "<td align='right'>".b2ks2($sarr[$i][0])."</td>\n";
   print DSP "<td align='right'>".get_nn($sarr[$i][2])."</td>\n";
   print DSP "<td align='right'>".get_nn($sarr[$i][3])."</td>\n";
   print DSP "<td>".date_string($ltt)."</td>\n";
   print DSP "<td>".date_string($htt)."</td>\n";
   print DSP "</tr>\n";
   $stbyts += $sarr[$i][0];
   $stdirs += $sarr[$i][2];
   $stfils += $sarr[$i][3];
   $gtbyts += $sarr[$i][0];
   $gtdirs += $sarr[$i][2];
   $gtfils += $sarr[$i][3];
   if ($lt < $lotime) {
      $lotime = $lt;
   }
   if ($ht > $hitime) {
      $hitime = $ht;
   }
   if ($lt < $tlotime) {
      $tlotime = $lt;
   }
   if ($ht > $thitime) {
      $thitime = $ht;
   }
   prt( $sarr[$i][1]." ".$sarr[$i][0]."\n" );
}
print DSP "<tr>\n";
print DSP "<td>".addbold($cdnum)."</td>\n";
print DSP "<td>".addbold("Sub-Total")."</td>\n";
print DSP "<td align='right'>".addbold(b2ks2($stbyts))."</td>\n";
print DSP "<td align='right'>".addbold(get_nn($stdirs))."</td>\n";
print DSP "<td align='right'>".addbold(get_nn($stfils))."</td>\n";
print DSP "<td>".addbold(date_string(scalar localtime $lotime))."</td>\n";
print DSP "<td>".addbold(date_string(scalar localtime $hitime))."</td>\n";
print DSP "</tr>\n";
print DSP "<tr>\n";
print DSP "<td>".addbold($cdnum)."</td>\n";
print DSP "<td>".addbold("Grand-Total")."</td>\n";
print DSP "<td align='right'>".addbold(b2ks2($gtbyts))."</td>\n";
print DSP "<td align='right'>".addbold(get_nn($gtdirs))."</td>\n";
print DSP "<td align='right'>".addbold(get_nn($gtfils))."</td>\n";
print DSP "<td>".addbold(date_string(scalar localtime $tlotime))."</td>\n";
print DSP "<td>".addbold(date_string(scalar localtime $thitime))."</td>\n";
print DSP "</tr>\n";
print DSP "</table></p>\n";
}
# put least first
sub mycmp_ascend {
   if (${$a}[0] < ${$b}[0]) {
      prt( "-[".${$a}[0]."] < [".${$b}[0]."]\n" ) if $verb3;
      return -1;
   }
   if (${$a}[0] > ${$b}[0]) {
      prt( "+[".${$a}[0]."] < [".${$b}[0]."]\n" ) if $verb3;
      return 1;
   }
   prt( "=[".${$a}[0]."] < [".${$b}[0]."]\n" ) if $verb3;
   return 0;
}
sub mycmp_decend {
   if (${$a}[0] < ${$b}[0]) {
      prt( "+[".${$a}[0]."] < [".${$b}[0]."]\n" ) if $verb3;
      return 1;
   }
   if (${$a}[0] > ${$b}[0]) {
      prt( "-[".${$a}[0]."] < [".${$b}[0]."]\n" ) if $verb3;
      return -1;
   }
   prt( "=[".${$a}[0]."] < [".${$b}[0]."]\n" ) if $verb3;
   return 0;
}
sub in_excluded {
   my ($d) = shift;
   foreach my $xd (@excl_dir) {
      if (uc($xd) eq uc($d)) {
         return 1;
      }
   }
   return 0;
}
sub do_user_dir { # ONLY called for ROOT scan of USER FOLDER
   my $dir = shift; # get the passed FOLDER
   prt( "Processing folder [$dir] ...\n" ) if ($verbose || $dbg4);
   if (in_excluded($dir)) {
      prt( "Directory [$dir] is in EXCLUDED list ...\n" );
      return;
   }
   my $lowtm = time();
   my $hitm = 0;
   opendir(THEDIR, $dir) || die("Couldn't open [$dir] directory\n");
   my @files = readdir(THEDIR); # slurp in ALL directories, and file, (and . & ..!)
   closedir(THEDIR);
   my $tsz = 0; # start a TOTAL for this FOLDER
   my $estsiz = 0;   # start a SECTOR TOTAL for this folder
   prt( "Found " . scalar(@files) . " files and folders ...\n" ) if $verbose;
   my @dir_list;
   foreach my $dfile (@files) {
      my $df = $dir . '/' . $dfile; # get full name
      my $sb = stat($df);
      if ( -d $df ) { # is directory?
         # if ($dfile eq '.' || $dfile eq '..') or
         if ($dfile =~ '^\.$' || $dfile =~ '^\.\.$') {
            # do nothing with DOT and DOUBLE DOT
         } else {
            if (in_excluded($dfile)) {
               prt( "Directory [$dfile] is in EXCLUDED list!\n" );
               next;
            }
           push(@dir_list, $df); # save local DIRECTORY LIST
           prt( "$dfile <DIR> [$df]\n" ) if $verb2;
           if ($dbg) {
                 printf "Folder is %s, size is %s, perm %04o, mtime %s\n",
               $dfile, $sb->size, $sb->mode & 07777,
               scalar localtime $sb->mtime;
           }
           if ($sb->mtime < $lowtm) {
              $lowtm = $sb->mtime;
           }
           if ($sb->mtime > $hitm) {
              $hitm = $sb->mtime;
           }
           if ($sb->mtime < $gt_lowtm) {
              $gt_lowtm = $sb->mtime;
              prt( "Set Low-Time to ".(scalar localtime $gt_lowtm)." ($gt_lowtm)1\n" ) if ($dbgtml);
           }
           if ($sb->mtime > $gt_hitm) {
              $gt_hitm = $sb->mtime;
              prt( "Set Hi-Time to ".(scalar localtime $gt_hitm)." ($gt_hitm)1\n" ) if ($dbgtmh);
           }
           $tot_dirs++; # tsz += $block;
           $estsiz += 3 * $block;   # estimate THREE(3) blcoks for a FOLDER
         }
      } else { # it is a FILE
         # PROCESSING A FILE
         # #################
         if (defined $sb) {
           prt( "$dfile full [$df] ".$sb->size." bytes\n" ) if $verb2;
           if ($dbg) {
            printf "File is %s, size is %s, perm %04o, mtime %s\n",
               $dfile, $sb->size, $sb->mode & 07777,
               scalar localtime $sb->mtime;
           }
           if ($sb->mtime < $lowtm) {
              $lowtm = $sb->mtime;
           }
           if ($sb->mtime > $hitm) {
              $hitm = $sb->mtime;
           }
           if ($sb->mtime < $gt_lowtm) {
              $gt_lowtm = $sb->mtime;
              prt( "Set Low-Time to ".(scalar localtime $gt_lowtm)." ($gt_lowtm)2\n" ) if ($dbgtml);
           }
           if ($sb->mtime > $gt_hitm) {
              $gt_hitm = $sb->mtime;
              prt( "Set Hi-Time to ".(scalar localtime $gt_hitm)." ($gt_hitm)2\n" ) if ($dbgtmh);
           }
           $tot_files++;
           $tsz += $sb->size;
           my $blks = int($sb->size / $block);
           $blks++ if ($sb->size % $block);
           $estsiz += $blks * $block;
         } else {
            push(@undefd,$df);
         }
      }
   }
   if ($fullname) {
      $msg = ("$dir is $tsz bytes ... done " . scalar @files .
         " files ($tot_files) and folders ($tot_dirs)..." );
   } else {
      $msg = ( subactdir($dir) . " is $tsz bytes ... done " . scalar @files .
         " files ($tot_files) and folders ($tot_dirs)..." );
   }
   prt( "$msg\n" ) if ($verbose);
   $g_tot_files = $tot_files;
   $g_tot_dirs = $tot_dirs;
   $tsz = $estsiz if ($use_est);
   $msg = "$actdir|$tsz|$g_tot_dirs|$g_tot_files|$lowtm|$hitm";
   push(@rows,$msg); # build up the ROW of informatiom, for the ROOT FOLDER only
   prt( "$msg\n" );   # THIS IS THE FIRST ENTRY
   push(@rows2, [$tsz,$actdir,$g_tot_dirs,$g_tot_files,$lowtm,$hitm]);
   $tot_all += $tsz; # add to ALL total
   $tot_sub += $tsz; # add to sub-total
   if ($tot_sub > $max_cd) {
      prt("Root folder has $tot_sub, which is greater than $max_cd ... NO MAX. CHECKING!\n");
      $no_max = 1; # set failed on FIRST - no more checking
   }
   # have DONE root, now process each folder
   #########################################
   foreach $dir (@dir_list) {
      $tot_files = 0;
      $tot_dirs = 0;
      my $sub_tot = do_sub_dir($dir,1);
      $tot_all += $sub_tot; # add to ALL total
      ##########################################################
      ### CHECK FIRST - $tot_sub += $sub_tot; # add to sub-total
      if ( ! $no_max ) { # $no_max = 0 - set if failed on FIRST - no more checking
         if (($tot_sub + $sub_tot) > $max_cd) {
            my $last_row = pop @rows;   # remove LAST element
            prt( "Sub-Total: (".b2ks2($tot_sub)." + ".b2ks2($sub_tot).") = ".b2ks2($tot_sub+$sub_tot)." > ".b2ks2($max_cd)." - inserting sub-total BEFORE last ...\n" ) if ($dbg5);
            $msg = ("Sub-Total|$tot_sub|$g_tot_dirs|$g_tot_files|*|*");
            push(@rows,$msg);
            push(@rows,$last_row) if (defined $last_row);
            $tot_sub = 0; # restart total
            $had_sub++;
         }
        }
      $tot_sub += $sub_tot; # add to sub-total
      $tsz += $sub_tot; # add to cumulative
      ###$tsz += do_sub_dir($dir,1);
      $g_tot_files += $tot_files;
      $g_tot_dirs += $tot_dirs;
   }
   #########################################
   if ( ! $no_max ) {
      if (($tot_sub > $max_cd) || ($had_sub > 0)) {
         ### $no_max = 1; # set failed on FIRST - no more checking
         $msg = ("Sub-Total|$tot_sub|$g_tot_dirs|$g_tot_files|*|*");
         push(@rows,$msg);
         $tot_sub = 0; # restart total
         $had_sub++;
      }
   }
   return $tsz;
}
sub do_sub_dir {
    my ($dir,$level) = @_;
   prt ("Processing sub-folder [$dir] ... level $level\n") if ($verb2 || $dbg6);
   if ($level == 1) {
      $g_lowtm = time();
      $g_hitm = 0;
   }
   opendir(THEDIR, $dir) || mydie("Couldn't open [$dir] directory\n");
   my @files = readdir(THEDIR);
   closedir(THEDIR);
   my $tsz = 0;
   my $estsiz = 0;   # estimated BLOCKS size (sectors)
   my $hdr = "";
   for (my $i = 0; $i < $level ; $i++ ) {
      $hdr .= "    ";
   }
   prt ($hdr . "Found " . scalar(@files) . " files and folders ... (l=$level)\n") if $verb2;
   foreach my $dfile (@files) {
      my $df = $dir . '/' . $dfile; # get full name
      my $sb = stat($df);
      if ( -d $df ) {
         # if ($dfile eq '.' || $dfile eq '..') or
         if ($dfile =~ '^\.$' || $dfile =~ '^\.\.$') {
            # do nothing with DOT and DOUBLE DOT
         } else {
           if (in_excluded($dfile)) {
              prt( "Directory [$dfile] is in EXCLUDED list!\n" );
              next;
           }
           prt ($hdr . "$dfile <DIR> [$df]\n") if $verb2;
           if ($dbg) {
                 printf "Folder is %s, size is %s, perm %04o, mtime %s\n",
               $dfile, $sb->size, $sb->mode & 07777,
               scalar localtime $sb->mtime;
           }
           if ($sb->mtime < $g_lowtm) {
              $g_lowtm = $sb->mtime;
           }
           if ($sb->mtime > $g_hitm) {
              $g_hitm = $sb->mtime;
           }
           if ($sb->mtime < $gt_lowtm) {
              $gt_lowtm = $sb->mtime;
              prt( "Set Low-Time to ".(scalar localtime $gt_lowtm)." ($gt_lowtm)3\n" ) if ($dbgtml);
           }
           if ($sb->mtime > $gt_hitm) {
              $gt_hitm = $sb->mtime;
              prt( "Set Hi-Time to ".(scalar localtime $gt_hitm)." ($gt_hitm)3\n" ) if ($dbgtmh);
           }
           prt( "Processing sub-folder $dfile ...\n" );
           $estsiz += (3 * $block);
           my $subtot = do_sub_dir($df,($level+1));
           $tsz += $subtot;
           $estsiz += $subtot;
         }
         $tot_dirs++; # count folders, and recurse into, except '.' & '..' ;=))
      } else {
         # PROCESSING A FILE
        prt ($hdr . "$dfile full [$df] ".$sb->size." bytes\n" ) if $verb2;
        if (defined $sb) {
           $mt = $sb->mtime;
           if ($dbg) {
            printf "File is %s, size is %s, perm %04o, mtime %s\n",
               $dfile, $sb->size, $sb->mode & 07777,
               scalar localtime $sb->mtime;
           }
           if ($mt < $mintime) {
              $mincnt += 1;
              prt( "WARNING: Avoiding setting Lo-Time from this file!\n" );
              prt( "File is [$df]\nSize ".($sb->size)." perm ".($sb->mode & 07777)." mtime ".(scalar localtime $sb->mtime)." !!!\n");
           } else {
              if ($mt < $g_lowtm) {
                 $g_lowtm = $mt;
              }
              if ($mt > $g_hitm) {
                 $g_hitm = $mt;
              }
              if ($mt < $gt_lowtm) {
                 $gt_lowtm = $mt;
                 prt( "Set Low-Time to ".(scalar localtime $gt_lowtm)." ($gt_lowtm)4\n" ) if ($dbgtml);
              }
              if ($mt > $gt_hitm) {
                 $gt_hitm = $mt;
                 prt( "Set Hi-Time to ".(scalar localtime $gt_hitm)." ($gt_hitm)4\n" ) if ($dbgtmh);
              }
           }
           $tot_files++;
           $tsz += $sb->size;
           my $blks = int($sb->size / $block);
           $blks++ if ($sb->size % $block);
           $estsiz += ($blks * $block);
        } else {
           push (@undefd, $df);
        }
      }
   }
   $tsz = $estsiz if ($use_est);
   if ($level == 1) {
      # iteration COMPLETE - we are exiting to the ROOT
      #################################################
      if ($fullname) {
         $msg = ("$dir is $tsz bytes ... done " . scalar @files .
            " files ($tot_files) and folders ($tot_dirs)..." );
      } else {
         $msg = (subactdir($dir) . " is $tsz bytes ... done " . scalar @files .
            " files ($tot_files) and folders ($tot_dirs)..." );
      }
      prt( "$msg\n" ) if $verbose;
      # prt( addbold($msg). "\n" ) if $verbose;
      my $sad = subactdir($dir);
      ### $msg = (subactdir($dir) . "|${tsz}|$tot_dirs|$tot_files");
      $msg = ("$sad|$tsz|$tot_dirs|$tot_files|$g_lowtm|$g_hitm");
      push(@rows,$msg); # build up the ROW of informatiom
      push(@rows2, [$tsz,$sad,$tot_dirs,$tot_files,$g_lowtm,$g_hitm]);
      prt( "$msg\n" );
      ###################################################
   }
   prt( "Returning $tsz (".b2ks2($tsz).") for ".subactdir($dir).", but est is $estsiz ".b2ks2($estsiz)."...\n" ) if ($dbg7 && !$use_est);
   return $tsz;
}
sub parse_arguments {
 my @av = @_; # take it off the passed stack
 while (@av) {
  my $arg = $av[0];
  if ($arg eq '-i') {
     require_argument(@av);
     shift @av;
      $arg = $av[0];
     if ( ! -f $arg) { mydie("ERROR: Can not locate input file '$arg'!"); }
     open (INF, "<$arg") or mydie("ERROR: Unable to OPEN file '$arg'!");
      my @la = <INF>;   # slurp whole file
     foreach my $f (@la) {
        chomp $f;
        if (length($f) > 0) {
           if ( -f $f ) {
              prt( "Storing file argument [$f].\n" );
              push(@in_files, $f);
           } elsif ( -d $f ) {
              prt( "Storing folder argument [$f].\n" );
              push(@in_files, $f);
           } else {
              prt("WARNING: Can not locate '$f' item - discarding!");
           }
        }
     }
     close(INF);
  } elsif ($arg eq '-version') {
      mydie( "Version 0.0.1\n" );
  } elsif ($arg eq '-verbose' || $arg eq '-v') {
     prt( "Setting verbose ...\n" );
     $verbose = 1;
  } elsif ($arg eq '-debug') {
     prt( "Setting debug output ...\n" );
     $dbg = 1;
  } elsif ($arg eq '-v2') {
     prt( "Setting verb2 ...\n" );
     $verb2 = 1;
  } elsif ($arg eq '-v3') {
     prt( "Setting verb3 ...\n" );
     $verb3 = 1;
  } elsif ($arg eq '-max') {
     require_argument(@av);
     shift @av;
     $arg = $av[0];
     $max_cd = $arg * 1024 * 1024;
     prt( "Setting max CD/DVD to $max_cd (".b2ks2($max_cd).") ...\n" );
  } elsif ($arg =~ /^-/) {
     $arg = "$0: unrecognised option? [$arg]\n";
     $arg .= " -debug   - set debug on. Presently ".($dbg ? "ON" : "OFF")."\n";
     $arg .= " -i fn    - use 'fn' as an input file, containing folders per line.\n";
     $arg .= " -max nnn - maximum CD/DVD size, where nnn is in MB. Default = ".b2ks2($max_cd)."\n";
     $arg .= " -version - displays version and exits\n";
     $arg .= " -verbose - set verbosity (or -v). Presently ".($verbose ? "ON" : "OFF")."\n";
     $arg .= " -v2      - set verb2. Presently ".($verb2 ? "ON" : "OFF")."\n";
     $arg .= " -v3      - set verb3. Presently ".($verb3 ? "ON" : "OFF")."\n";
     $arg .= " input_folder[s] - Directories to process ... recursive assumed.\n";
     $arg .= "If none given, then current work directory used.\n";
     mydie( "$arg\n" );
  } else {
     prt( "Storing argument [$arg].\n" );
      push(@in_files, $arg);
  }
  shift @av; # move to next argument to [0]
 }
 push(@in_files, ".") if ! @in_files; # default to current folder
}
# Ensure argument exists, or die.
sub require_argument {
    my ($arg, @arglist) = @_;
    mydie( "$0: no argument given for option '$arg'\n" ) if ! @arglist;
}
sub dirname { # passed a path, './dir1/dir2/file.name' returns './dir1/dir2/
my ($file) = @_;
my ($sub);
($sub = $file) =~ s,/+[^/]+$,,g;
$sub = '.' if $sub eq $file;
return $sub;
}
sub retfulldir {
 my ($d) = @_;
 if ($d =~ '^\.$') {
    $d = $cwdir; # set CURRENT WORK DIRECTORY
 } elsif ( $d =~ '^\.\.$') {
   $d = dirname( $cwdir ); # back up one ...
 }
 return $d;
}
sub subactdir {
   my ($d) = @_;
   my ($nd);
   #my $s = "s,^\$actdir,,";
   #prt ("rem $actdir frm $d use $s\n");
   #($nd = $d) =~ s,^C:/GTools/perl,,; # ok
   #($nd = $d) =~ $s; # fails???
   ($nd = $d) =~ s,^$actdir,,;
   if (length($nd) == 0) {
      $nd = $actdir;
   } else {
      $nd =~ s,^/,,;
   }
#   $nd = 'root' if length $nd == 0;
   return $nd;
}
sub addbold {
   return( "<b>@_</b>" );
}
sub addcolm {
   return( "  <td>@_</td>" );
}
sub addcolmr { # string tdr = "  <TD align=\"right\">"MEOS;
   return( "  <td align=\"right\">@_</td>" );
}
sub html_head {
   my ($fh, $hdr) = @_;
   print $fh <<"EOF";
<html>
<head>
<title>$hdr</title>
</head>
<body>
<h1 align="center">$hdr</h1>
EOF
}
sub html_head2 {
   my ($os, $hdr) = @_;
   print $os "<html>\n";
   print $os "<!-- title " . $hdr . " -->\n";
   print $os "<head>\n";
   print $os "<title>" . $hdr . "</title>\n";
   print $os '<style type="text/css">'."\n";
   print $os ".ctr { text-align:center; }\n";
   print $os "body.blueform\n";
   print $os "{\n";
   print $os "    BORDER-RIGHT: #4169e1 double;\n";
   print $os "    PADDING-RIGHT: 2px;\n";
   print $os "    BORDER-TOP: #4169e1 double;\n";
   print $os "    PADDING-LEFT: 2px;\n";
   print $os "    PADDING-BOTTOM: 2px;\n";
   print $os "    MARGIN: 3px;\n";
   print $os "    BORDER-LEFT: #4169e1 double;\n";
   print $os "    PADDING-TOP: 2px;\n";
   print $os "    BORDER-BOTTOM: #4169e1 double;\n";
   print $os "    BACKGROUND-COLOR: #add8e6\n";
   print $os "}\n";
   print $os ".sbfixed\n";
   print $os "{\n";
   print $os "    ALIGN: 'center'\n";
   print $os "    COLOR: #00008b;\n";
   print $os "    FONT-FAMILY: 'Courier New';\n";
   print $os "    BACKGROUND-COLOR: #afeeee\n";
   print $os "}\n";
   print $os "</style>\n";
   print $os "</head>\n";
   print $os "<body class=\"blueform\">\n";
   print $os "\n";
   print $os "<h1 align=\"center\">" . $hdr . "</h1>\n";
}
sub html_tail {
   my ($fh) = @_;
   print $fh <<"EOF";
</body>
</html>
EOF
}
sub b2ks2 {
   my ($d) = @_;
   my $oss;
   my $kss;
   my $lg = 0;
   my $ks = ($d / 1024); #// get Ks
   my $div = 1;
   if( $ks < 1024 ) {
      $div = 1;
      $oss = "KB";
   } elsif ( $ks < (1024*1024) ) {
     $div = 1024;
      $oss = "MB";
   } elsif ( $ks < (1024*1024*1024) ) {
      $div = 1024 * 1024;
      $oss = "GB";
   } else {
      $div = 1024 * 1204 * 1240;
      $oss = "TB";
   }
   $kss = $ks / $div;
   $kss += 0.05;
   $kss *= 10;
   $lg = int($kss);
   return( ($lg / 10) . " " . $oss );
   ###return( ($lg / 10) . $oss );
}
#string dirghtml::b2ks1(double d) // b2ks1(double d)
sub b2ks1 {
   my ($d) = @_;
   my $oss;
   my $kss;
   my $lg = 0;
   my $ks = ($d / 1024); #// get Ks
   my $div = 1;
   if( $ks < 1000 ) {
      $div = 1;
      $oss = "KB";
   } elsif ( $ks < 1000000 ) {
     $div = 1000;
      $oss = "MB";
   } elsif ( $ks < 1000000000 ) {
      $div = 1000000;
      $oss = "GB";
   } else {
      $div = 1000000000;
      $oss = "TB";
   }
   $kss = $ks / $div;
   $kss += 0.05;
   $kss *= 10;
   $lg = int($kss);
   return( ($lg / 10) . " " . $oss );
   ###return( ($lg / 10) . $oss );
}
sub get_nn { # perl nice number nicenum add commas
   my ($n) = @_;
   if (length($n) > 3) {
      my $mod = length($n) % 3;
      my $ret = (($mod > 0) ? substr( $n, 0, $mod ) : '');
      my $mx = int( length($n) / 3 );
      for (my $i = 0; $i < $mx; $i++ ) {
         if (($mod == 0) && ($i == 0)) {
            $ret .= substr( $n, ($mod+(3*$i)), 3 );
         } else {
            $ret .= ',' . substr( $n, ($mod+(3*$i)), 3 );
         }
      }
      return $ret;
   }
   return $n;
}
sub english_date_from_iso_style_date{
     my $date=shift;
     $date=~/(\d{4})(\d{2})(\d{2})/;
     my $d=Date::Handler->new({date=>{year=>$1,
          month=>$2,day=>$3}});
     return $d->MonthName().' '.$d->Day().', '.$d->Year();
}
## month to number
sub mth_to_num {
   my ($mth) = shift;
   my $cnt = 0;
   ###prt( "Chk [$mth] " );
   foreach my $m (@mths) {
      $cnt++;
      if ($m eq $mth) {
         ###prt( "Is $m - return $cnt\n" );
         return $cnt;
      }
   }
   prt( "WARNING: Returning 0!!!\n" );
   return '??';
}
# change localtime (Sat Mar 12 03:11:55 2005) to YYYY/MM/DD
sub date_string {
   my ($tm) = shift;
   my @arr = split( / /, $tm ); # time of form 'Sat Mar 12 03:11:55 2005'
   my $ac = scalar @arr;
   my $doff = 2;
   my $yoff = 4;
   if ($ac == 5) {
      $doff = 2;
      $yoff = 4;
   } elsif ($ac == 6) {
      $doff = 3;
      $yoff = 5;
   } else {
      mydie( "ERROR: Time ($tm) did NOT split correctly!\n" );
   }
   my $mn = mth_to_num( $arr[1] );
   if ($mn < 10) {
      $mn = '0'.$mn;
   }
   my $dn = $arr[$doff];
   if ($dn < 10) {
      $dn = '0'.$dn;
   }
   my $dtt = $arr[$yoff].'/'.$mn.'/'.$dn; # translated to 2005/03/12
   return $dtt;
}
# eof - dirg3.pl

index -|- top

checked by tidy  Valid HTML 4.01 Transitional