add a note

User Contributed Notes 9 notes

up
501
anagai at yahoo dot com
11 years ago
This will delete all files in a directory matching a pattern in one line of code.

<?php array_map('unlink', glob("some/dir/*.txt")); ?>
up
117
dexen dot devries at gmail dot com
13 years ago
Deleted a large file but seeing no increase in free space or decrease of disk usage? Using UNIX or other POSIX OS?

The unlink() is not about removing file, it's about removing a file name. The manpage says: ``unlink - delete a name and possibly the file it refers to''.

Most of the time a file has just one name -- removing it will also remove (free, deallocate) the `body' of file (with one caveat, see below). That's the simple, usual case.

However, it's perfectly fine for a file to have several names (see the link() function), in the same or different directories. All the names will refer to the file body and `keep it alive', so to say. Only when all the names are removed, the body of file actually is freed.

The caveat:
A file's body may *also* be `kept alive' (still using diskspace) by a process holding the file open. The body will not be deallocated (will not free disk space) as long as the process holds it open. In fact, there's a fancy way of resurrecting a file removed by a mistake but still held open by a process...
up
77
deen804 at gmail dot com
10 years ago
unlink($fileName); failed for me .
Then i tried using the realpath($fileName) function as
unlink(realpath($fileName)); it worked

just posting it , in case if any one finds it useful .
up
29
federico at poisonfx dot com
13 years ago
Here the simplest way to delete files with mask

<?php
$mask
= "*.jpg"
array_map( "unlink", glob( $mask ) );
?>
up
17
PD
16 years ago
I have been working on some little tryout where a backup file was created before modifying the main textfile. Then when an error is thrown, the main file will be deleted (unlinked) and the backup file is returned instead.

Though, I have been breaking my head for about an hour on why I couldn't get my persmissions right to unlink the main file.

Finally I knew what was wrong: because I was working on the file and hadn't yet closed the file, it was still in use and ofcourse couldn't be deleted :)

So I thought of mentoining this here, to avoid others of making the same mistake:

<?php
// First close the file
fclose($fp);

// Then unlink :)
unlink($somefile);
?>
up
18
chris at vibenewmedia dot com
19 years ago
To delete all files of a particular extension, or infact, delete all with wildcard, a much simplar way is to use the glob function. Say I wanted to delete all jpgs .........

<?php

foreach (glob("*.jpg") as $filename) {
echo
"$filename size " . filesize($filename) . "\n";
unlink($filename);
}

?>
up
10
gotdalife at gmail dot com
15 years ago
To anyone who's had a problem with the permissions denied error, it's sometimes caused when you try to delete a file that's in a folder higher in the hierarchy to your working directory (i.e. when trying to delete a path that starts with "../").

So to work around this problem, you can use chdir() to change the working directory to the folder where the file you want to unlink is located.

<?php
$old
= getcwd(); // Save the current directory
chdir($path_to_file);
unlink($filename);
chdir($old); // Restore the old working directory
?>
up
2
Eric
10 years ago
This might seem obvious, but I was tearing my hair out with this problem - make sure the file you're trying to delete isn't currently being used. I had a script that was parsing a text file and was supposed to delete it after completing, but kept getting a permission denied error because I hadn't explicitly closed the file, hence it was technically still being "used" even though the parsing was complete.
up
-3
divinity76+spam at gmail dot com
2 years ago
if you're looking for a recursive unlink:
<?php

/**
* delete a file or directory
* automatically traversing directories if needed.
* PS: has not been tested with self-referencing symlink shenanigans, that might cause a infinite recursion, i don't know.
*
* @param string $cmd
* @throws \RuntimeException if unlink fails
* @throws \RuntimeException if rmdir fails
* @return void
*/
function unlinkRecursive(string $path, bool $verbose = false): void
{
if (!
is_readable($path)) {
return;
}
if (
is_file($path)) {
if (
$verbose) {
echo
"unlink: {$path}\n";
}
if (!
unlink($path)) {
throw new
\RuntimeException("Failed to unlink {$path}: " . var_export(error_get_last(), true));
}
return;
}
$foldersToDelete = array();
$filesToDelete = array();
// we should scan the entire directory before traversing deeper, to not have open handles to each directory:
// on very large director trees you can actually get OS-errors if you have too many open directory handles.
foreach (new DirectoryIterator($path) as $fileInfo) {
if (
$fileInfo->isDot()) {
continue;
}
if (
$fileInfo->isDir()) {
$foldersToDelete[] = $fileInfo->getRealPath();
} else {
$filesToDelete[] = $fileInfo->getRealPath();
}
}
unset(
$fileInfo); // free file handle
foreach ($foldersToDelete as $folder) {
unlinkRecursive($folder, $verbose);
}
foreach (
$filesToDelete as $file) {
if (
$verbose) {
echo
"unlink: {$file}\n";
}
if (!
unlink($file)) {
throw new
\RuntimeException("Failed to unlink {$file}: " . var_export(error_get_last(), true));
}
}
if (
$verbose) {
echo
"rmdir: {$path}\n";
}
if (!
rmdir($path)) {
throw new
\RuntimeException("Failed to rmdir {$path}: " . var_export(error_get_last(), true));
}
}
?>
To Top