Looks fine, although personally I'd...

sleep $i;

... and maybe ...

$self->log_info("Couldn't remove '$_'; trying " . (5 - $i) . " more times\n");

Adam K

2009/1/15 David Golden <[email protected]>:
> Based on the thread about my file deletion heisenbug and the likelihood that
> a virus scanner was keeping files open preventing deletion, I propose the
> following patch specific to Windows.  It's cut-and-paste from Base.pm, but
> adding a loop around rmtree.
>
> I'd appreciate any feedback you might have on this hacky solution.
>
> Thanks,
> David
>
> === lib/Module/Build/Platform/Windows.pm
> ==================================================================
> --- lib/Module/Build/Platform/Windows.pm    (revision 12568)
> +++ lib/Module/Build/Platform/Windows.pm    (local)
> @@ -29,6 +29,25 @@
>   return $value;
>  }
>
> +sub delete_filetree {
> +  my $self = shift;
> +  my $deleted = 0;
> +  foreach (@_) {
> +    next unless -e $_;
> +    $self->log_info("Deleting $_\n");
> +    # try to delete up to 5 times (in case virus scanners are keeping files
> open)
> +    for my $i ( 1 .. 5 ) {
> +      File::Path::rmtree($_, 0, 0);
> +      last if ! -e $_;
> +      $self->log_info("Couldn't remove '$_'; trying again\n");
> +      sleep 1;
> +    }
> +    die "Couldn't remove '$_': $!\n" if -e $_;
> +    $deleted++;
> +  }
> +  return $deleted;
> +}
> +
>  sub ACTION_realclean {
>   my ($self) = @_;
>

Reply via email to