You want to delete a file. Perl's
delete
function isn't what you want.
Use Perl's standard
unlink
function:
unlink($FILENAME) or die "Can't delete $FILENAME: $!\n"; unlink(@FILENAMES) == @FILENAMES or die "Couldn't unlink all of @FILENAMES: $!\n";
The
unlink
function takes its name from the Unix system call. Perl's
unlink
takes a list of filenames and returns the number of filenames successfully deleted. This return value can then be tested with
||
or
or
:
unlink($file) or die "Can't unlink $file: $!";
unlink
doesn't report which filenames it couldn't delete, only how many it did delete. Here's one way to test for successful deletion of many files and to report the number deleted:
unless (($count = unlink(@filelist)) == @filelist) { warn "could only delete $count of " . (@filelist) . " files"; }
A
foreach
over
@filelist
would permit individual error messages.
Under Unix, deleting a file from a directory requires write access to the directory,[ 1 ] not to the file, because it's the directory you're changing. Under some circumstances, you could remove a file you couldn't write to or write to a file you couldn't remove.
[1] Unless the sticky bit, mode 01000, is turned on for the directory, which further restricts deletions to be by the owner only. Shared directories like /tmp are usually mode 01777 for security reasons.
If you delete a file that some process still has open, the operating system removes the directory entry but doesn't free up data blocks until all processes have closed the file. This is how the
new_tmpfile
function in IO::File (see
Recipe 7.5
) works.
The
unlink
function in
perlfunc
(1) and in
Chapter 3
of
Programming Perl
; your system's
unlink
(2) manpage; we use the idea of a file that has been deleted but is still accessible in
Recipe 7.5