MISE À JOUR: Contrairement à ma demande initiale que le code suivant ne fonctionne pas, il semble en effet fonctionner. J'ai juste oublié que le fichier que je voulais supprimer n'était pas en $ENV{TEMP}
mais un sous-répertoire de $ENV{TEMP}
. Le problème est, le fichier ne va pas à la corbeille.
La bonne solution est d'utiliser Win32::FileOp mais je vais laisser ce script ici comme un exemple de la façon d'utiliser Win32::API et Win32::API::Struct. J'apprécierais que quelqu'un puisse signaler ce que je fais de mal. À titre de référence:
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__
Pourquoi ne pas simplement recycler (@ARGV)? –
Bon point. J'ai édité la réponse. – FMc
perl -MWin32 :: FileOp = Recycle -eRecycle (@ARGV) ... –