UPDATE: Contrariamente alla mia affermazione iniziale che il seguente codice non funziona, sembra davvero funzionare. Ho appena dimenticato che il file che volevo eliminare non era in $ENV{TEMP}
ma una sottodirectory di $ENV{TEMP}
. Il problema è che il file non va nel Cestino.
La soluzione corretta è utilizzare Win32::FileOp ma ho intenzione di lasciare questo script qui come esempio di come utilizzare Win32::API e Win32::API::Struct. Lo apprezzerei se qualcuno potesse indicare cosa sto facendo male. Per il vostro riferimento:
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__
fonte
2009-06-30 13:26:05
Perché non solo ricicla (@ARGV)? –
Buon punto. Ho modificato la risposta. – FMc
perl -MWin32 :: FileOp = Recycle -eRecycle (@ARGV) ... –