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) = @_;
>