Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?

Re: Re: File copy progress.

by zzspectrez (Hermit)
on Dec 05, 2000 at 19:00 UTC ( #44992=note: print w/replies, xml ) Need Help??

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..


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.


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


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


        Update: Removed the trailing \n.

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (3)
As of 2023-06-03 18:59 GMT
Find Nodes?
    Voting Booth?
    How often do you go to conferences?

    Results (16 votes). Check out past polls.