in reply to Copying a directory and its contents wihile displaying a progress bar
You would make your life alot easier if you can tar or zip up your directory, and just move the single file.
Since you mention File::Find, I will assume a local move. If you want to do this on a local filesystem, you would need to open the source dir and target dir, then manually open and sysread each file in small chunks, then as you write them to the target dir, make your 'progress dot'. You could do a total byte count before starting the copy, so you could get a byte percentage. The problem with doing this, is it will slow down all your file transfers..... so why bother?
In general: when you want to show progress, you need to intercept the callback that does the copying. Like this with LWP. ( Also see Track file upload progress )
#!/usr/bin/perl -w use strict; use LWP::UserAgent; # don't buffer the prints to make the status update $| = 1; my $ua = LWP::UserAgent->new(); my $received_size = 0; my $url = 'http://www.cpan.org/authors/id/J/JG/JGOFF/parrot-0_0_7.tgz' +; print "Fetching $url\n"; my $request_time = time; my $last_update = 0; my $response = $ua->get($url, ':content_cb' => \&callback, ':read_size_hint' => 8192, ); print "\n"; sub callback { my ($data, $response, $protocol) = @_; my $total_size = $response->header('Content-Length') || 0; $received_size += length $data; # write the $data to a filehandle or whatever should happen # with it here. Otherwise the data isn't saved my $time_now = time; # this to make the status only update once per second. return unless $time_now > $last_update or $received_size == $total_s +ize; $last_update = $time_now; print "\rReceived $received_size bytes"; printf " (%i%%)", (100/$total_size)*$received_size if $total_size; printf " %6.1f/bps", $received_size/(($time_now-$request_time)||1) if $received_size; }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Copying a directory and its contents wihile displaying a progress bar
by bittis (Sexton) on Aug 04, 2008 at 16:20 UTC |