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

Sweet, a progress bar would be a nice touch.
--

Zigster

Replies are listed 'Best First'.
Re: Re: Re: Re: File copy progress.
by zzspectrez (Hermit) on Dec 06, 2000 at 05:27 UTC

    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.

        Cool!!!! I didnt think of using the repeat operator. Thats what I like about sharing your code here, someone usually allways has a good suggestion about how to do something better or a way to simplify. I had a problem getting the % to work in the printf.. I looked in the camel book and didnt see any example or explanation. I tryed escaping it like \%.. I didnt think of trying %%.

        One minor correction... The trailing \n needs to be removed from printf so that the status is displayed on the same line.