How about just adding in the following to the beginning of heavyraptor's code?
if (empty($dir))
return;
unlink
Beschrijving
bool unlink ( string filename )Verwijderd filename. Is gelijk aan de Unix C unlink() functie. Geeft TRUE terug bij succes, FALSE indien er een fout is opgetreden.
Opmerking: Vanaf PHP 5.0.0 kan unlink() ook gebruikt worden met sommige url wrappers. Kijk op Aanhangsel M voor een lijst met welke wrappers unlink() ondersteunen.
Zie ook rmdir() om folders te verwijderen.
unlink
WBT the FROG
04-Jan-2007 10:25
04-Jan-2007 10:25
LobsterMan
06-Dec-2006 02:11
06-Dec-2006 02:11
heavyraptor:
Your script is functional, but really dangerous. On server configurations where PHP has the sufficient permissions, passing an empty variable to this script means deleting root.
heavyraptor
02-Dec-2006 05:05
02-Dec-2006 05:05
The following function easily removes the Directory $dir and all its content.
<?php
function rmdirr($dir) {
if (substr($dir,-1) != "/") $dir .= "/";
if (!is_dir($dir)) return false;
if (($dh = opendir($dir)) !== false) {
while (($entry = readdir($dh)) !== false) {
if ($entry != "." && $entry != "..") {
if (is_file($dir . $entry) || is_link($dir . $entry)) unlink($dir . $entry);
else if (is_dir($dir . $entry)) rmdirr($dir . $entry);
}
}
closedir($dh);
rmdir($dir);
return true;
}
return false;
}
// Example:
$dir = "./MyDirectory/";
$res = rmdirr($dir); // Bye bye
if ($res == true) print "$dir got deleted.";
else print "Error while trying to delete $dir.";
?>
Have fun
torch at torchsdomain dot com
22-Nov-2006 09:27
22-Nov-2006 09:27
Here is simple function that will find and remove all files (except "." ones) that match the expression ($match, "*" as wildcard) under starting directory ($path) and all other directories under it.
function rfr($path,$match){
static $deld = 0, $dsize = 0;
$dirs = glob($path."*");
$files = glob($path.$match);
foreach($files as $file){
if(is_file($file)){
$dsize += filesize($file);
unlink($file);
$deld++;
}
}
foreach($dirs as $dir){
if(is_dir($dir)){
$dir = basename($dir) . "/";
rfr($path.$dir,$match);
}
}
return "$deld files deleted with a total size of $dsize bytes";
}
tristan
16-Oct-2006 06:01
16-Oct-2006 06:01
to delete all the files in a directory
<?php
foreach (glob("directorypath/*.*") as $filename)
{
unlink($filename);
}
?>
paul at pes-systems dot net
16-Aug-2006 07:27
16-Aug-2006 07:27
A work around for the Permission Denied problem.
I used ftp_connect() then ftp_delete() to erase files which unlink could not erase due to permision problems
khalidz83 at yahoo dot co dot uk
15-Feb-2006 04:18
15-Feb-2006 04:18
If you get an error while deleting a file from the system, check who is the owner of the file. For example if you move to another system and the owner is 'nobody' then the owner should be nobody for that file on the new system.If you delete as another user, you will get an error.
Anarcho at ssm-clan dot de
26-Nov-2005 11:56
26-Nov-2005 11:56
Just to be a bit more accurate to the post of "jchase at solidmark dot com":
On unixoide systems you only need write permission for the directory to delete a file. The permissions of the file are nonrelevant.
You need file permissions if you want to change the file data or to read the data.
bishop
05-Jun-2005 09:30
05-Jun-2005 09:30
<?php
/**
* rm() -- Vigorously erase files and directories.
*
* @param $fileglob mixed If string, must be a file name (foo.txt), glob pattern (*.txt), or directory name.
* If array, must be an array of file names, glob patterns, or directories.
*/
function rm($fileglob)
{
if (is_string($fileglob)) {
if (is_file($fileglob)) {
return unlink($fileglob);
} else if (is_dir($fileglob)) {
$ok = rm("$fileglob/*");
if (! $ok) {
return false;
}
return rmdir($fileglob);
} else {
$matching = glob($fileglob);
if ($matching === false) {
trigger_error(sprintf('No files match supplied glob %s', $fileglob), E_USER_WARNING);
return false;
}
$rcs = array_map('rm', $matching);
if (in_array(false, $rcs)) {
return false;
}
}
} else if (is_array($fileglob)) {
$rcs = array_map('rm', $fileglob);
if (in_array(false, $rcs)) {
return false;
}
} else {
trigger_error('Param #1 must be filename or glob pattern, or array of filenames or glob patterns', E_USER_ERROR);
return false;
}
return true;
}
?>
jchase at solidmark dot com
21-May-2005 07:05
21-May-2005 07:05
[Editor's note: A suggestion for a work-around was submitted by argistof at gmail dot com: You can use the recursive option (see man chmod) when chmodding, for instance 'chmod 777 directory/ -R'. Be aware though, this will change the permissions of all files and folders in the diectory.]
Just a note which you probably all know, but I didn't, and it might save another poor sap some unnecessary time:
I was doing unlink() and fopen() on a file and got a permission denied error, even after chmoding the file to 0777.
The folder that contains the file must ALSO have write permission. Took a headache to find this out.
Hope this helps someone :)
ashley at semantic dot org
02-Apr-2005 12:50
02-Apr-2005 12:50
Actually you should use "@unlink" rather than testing with file_exists. The former is atomic, whereas the latter can break if you can't guarantee only one process will try to delete a given file at a time.
dagski_AT_gmail_DOT_com
07-Feb-2005 07:19
07-Feb-2005 07:19
before you could unlink a file created which uses a handle e.g.,
$handle = sqlite('temp.db');
unset($handle); first befofe
unlink($handle);
to avoide permission denied error.
chris at vibenewmedia dot com
14-Sep-2004 07:54
14-Sep-2004 07:54
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);
}
?>
pc AT newagelab DOT com DOT ua
08-Sep-2004 05:22
08-Sep-2004 05:22
To delete files using wildcards:
<?
function delfile($str)
{
foreach(glob($str) as $fn) {
unlink($fn);
}
}
?>
