http://qs1969.pair.com?node_id=44992


in reply to Re: File copy progress.
in thread File copy progress.

Yeah.. I know it prints 100% twice. It only does that if the file doesnt evenly divide by 10. This code was a quick hack of 15 minutes to see if the idea would work. I still need to mess with it to make it work better.

The reason why I pass a subroutine as a variable to the copy routine is just so I could have the calling program determine how to display the status. That way I could just redefine that subroutine and have it display an actually prograss bar or something..

zzSPECTREz

Replies are listed 'Best First'.
Re: Re: Re: File copy progress.
by zigster (Hermit) on Dec 05, 2000 at 19:09 UTC
    Sweet, a progress bar would be a nice touch.
    --

    Zigster

      Here is quick but cheap way to do it. Im just posting the progress routine but in the main routine you also have to toss the percent variable and instead have a variable keep track of total bytes writen. Then call this sub passing it total_writen, and file size. This routine also uses fastolfe's suggestion of using \r instead of \n so just the line is updated ( works on win2k too!).

      sub FileProgress () { my $wrote = shift; my $size = shift; my $percent = $wrote / $size * 100; case: { if ($percent <11) { print "\r[* ]"; last;} if ($percent <21) { print "\r[** ]"; last;} if ($percent <31) { print "\r[*** ]"; last;} if ($percent <41) { print "\r[**** ]"; last;} if ($percent <51) { print "\r[***** ]"; last;} if ($percent <61) { print "\r[****** ]"; last;} if ($percent <71) { print "\r[******* ]"; last;} if ($percent <81) { print "\r[******** ]"; last;} if ($percent <91) { print "\r[********* ]"; last;} if ($percent <=100) { print "\r[**********]"; last;} } printf " %3u",$percent; print '%'; printf " done. %u bytes.",$wrote; return 1; }

      zzSPECTREz

        You probably don't want to be using a prototype of () for this sub as you'll be trying to pass arguments to a sub that (regardless of the shifts inside the sub) doesn't take any!

        You can also simplify things greatly by performing another sum (to get rid of that case: { ... })in combination with a single printf()...

        sub FileProgress { my $wrote = shift; my $size = shift; my $percent = $wrote / $size * 100; printf "\r[%-10s] %3u%% done. %u bytes", '*' x int( $percent / 10 ), $percent, $wrote; return 1; }

            --k.

        Update: Removed the trailing \n.