ACTUALIZACIÓN: Contrariamente a mi reclamo original que el código siguiente no funciona, que de hecho parece que funciona. Me olvidé de que el archivo que quería eliminar no estaba en $ENV{TEMP}
sino en un subdirectorio de $ENV{TEMP}
. El problema es que el archivo no va a la Papelera de reciclaje.
La solución correcta es usar Win32::FileOp pero voy a dejar este script aquí como un ejemplo de cómo usar Win32::API y Win32::API::Struct. Apreciaría si alguien puede señalar lo que estoy haciendo mal. Para su referencia:
SHFileOperation
: http://msdn.microsoft.com/en-us/library/bb762164(VS.85).aspx
LPSHFILEOPSTRUCT
: http://msdn.microsoft.com/en-us/library/bb759795(VS.85).aspx
#!/usr/bin/perl
use strict;
use warnings;
use File::Spec::Functions qw(catfile);
use Win32::API;
Win32::API::Struct->typedef(
SHFILEOPSTRUCT => qw(
HWND hwnd;
UINT wFunc;
LPCTSTR pFrom;
LPCTSTR pTo;
FILEOP_FLAGS fFlags;
BOOL fAnyOperationsAborted;
LPVOID hNameMappings;
LPCTSTR lpszProgressTitle;
)
);
Win32::API->Import(
shell32 => q{ int SHFileOperation(LPSHFILEOPSTRUCT lpFileOp) }
);
my $op = Win32::API::Struct->new('SHFILEOPSTRUCT');
$op->{wFunc} = 0x0003; # FO_DELETE from ShellAPI.h
$op->{fFlags} = 0x0040; # FOF_ALLOWUNDO from ShellAPI.h
my $to_delete = catfile($ENV{TEMP}, "test.file");
$op->{pFrom} = $to_delete . "\0\0";
my $result = SHFileOperation($op);
if ($result) {
warn sprintf "The operation failed: %4.4X\n", $result;
}
else {
if ($op->{fAnyOperationsAborted}) {
warn "Operation was aborted\n";
}
else {
warn "The operation succeeded\n";
}
}
__END__
¿Por qué no acaba de reciclar (@ARGV)? –
Buen punto. Edité la respuesta. – FMc
perl -MWin32 :: FileOp = Reciclar -eRecycle (@ARGV) ... –