The shortest recursive delete possible.
<?php
/**
* Delete a file or recursively delete a directory
*
* @param string $str Path to file or directory
*/
function recursiveDelete($str){
if(is_file($str)){
return @unlink($str);
}
elseif(is_dir($str)){
$scan = glob(rtrim($str,'/').'/*');
foreach($scan as $index=>$path){
recursiveDelete($path);
}
return @rmdir($str);
}
}
?>
unlink
(PHP 4, PHP 5)
unlink — ファイルを削除する
説明
bool unlink
( string $filename
[, resource $context
] )
filename を削除します。 Unix C 言語の関数 unlink() と動作は同じです。
パラメータ
- filename
-
ファイルへのパス。
- context
-
注意: コンテキストのサポートは、 PHP 5.0.0 で追加されました。contexts の説明に関しては、 ストリーム 関数 を参照してください。
返り値
成功した場合に TRUE を、失敗した場合に FALSE を返します。
変更履歴
| バージョン | 説明 |
|---|---|
| 5.0.0 | PHP 5.0.0 以降、unlink()は いくつかのURL ラッパと共に使用することもできます。 unlink()をサポートするラッパのリストについては サポートするプロトコル/ラッパーをご覧ください。 |
例
例1 基本的な unlink() の使用法
<?php
$fh = fopen('test.html', 'a');
fwrite($fh, '<h1>Hello world!</h1>');
fclose($fh);
mkdir('testdir', 0777);
unlink('test.html');
unlink('testdir');
?>
unlink
Eddy Vlad
24-Nov-2009 04:59
24-Nov-2009 04:59
reminder
12-Jun-2009 09:24
12-Jun-2009 09:24
careful with unlink...
"very unlikely" is not "impossible" : granted, it will happen.
1) "expected" : a typo and you'll get : unlink('/')
2) "very likely" : some of your files are writeable by anyone.
3) "possible" : you're backup drive is mounted and preserves the authorizations of the original files
4) "very unlikely" : that particular day, at that particular moment, the unlink function decided to work recursively
played all day long with ext3grep : no result.
Jon Hassall
16-Nov-2008 06:36
16-Nov-2008 06:36
Here is the recursive delete method made a little more readable:
<?php
/**
* Recursively delete a directory
*
* @param string $dir Directory name
* @param boolean $deleteRootToo Delete specified top-level directory as well
*/
function unlinkRecursive($dir, $deleteRootToo)
{
if(!$dh = @opendir($dir))
{
return;
}
while (false !== ($obj = readdir($dh)))
{
if($obj == '.' || $obj == '..')
{
continue;
}
if (!@unlink($dir . '/' . $obj))
{
unlinkRecursive($dir.'/'.$obj, true);
}
}
closedir($dh);
if ($deleteRootToo)
{
@rmdir($dir);
}
return;
}
?>
Anonymous
01-Nov-2008 02:13
01-Nov-2008 02:13
To unlink, the web server user must have write permissions to the directory.
Conversely, if a user has write permissions to a directory, it may delete files from that directory regardless of who owns them...
hi at hi dot hi
12-Oct-2008 03:19
12-Oct-2008 03:19
using this function with windows will generate an error, make sure to use is_file
MAMMDO
08-Oct-2008 11:37
08-Oct-2008 11:37
Hello, for those who have problems with the Permission denied just give FULL permission NOT just WRITE to the anonymous
user of your website.
garagod at gmail dot com
06-Oct-2008 05:36
06-Oct-2008 05:36
When I'm using unlink() or rename() with a SSH2.SFTP wrapper, both functions always return FALSE (but without a warning) even on success.
Example:
<?php
$connection = ssh2_connect(SERVER_NAME, PORT);
ssh2_auth_password($connection, USERNAME, PASSWORD);
$sftp = ssh2_sftp($connection);
unlink("ssh2.sftp://$sftp/" . REMOTE_DIRECTORY . FILENAME); // returns FALSE on success and on failure
rename("ssh2.sftp://$sftp/" . REMOTE_DIRECTORY . OLD_FILENAME, "ssh2.sftp://$sftp/" . REMOTE_DIRECTORY . NEW_FILENAME); // returns FALSE on success and on failure
?>
http://www.paladinux.net
01-Oct-2008 03:59
01-Oct-2008 03:59
Under Windows System and Apache, denied access to file is an usual error to unlink file.
To delete file you must to change file's owern.
An example:
<?php
chown($TempDirectory."/".$FileName,666); //Insert an Invalid UserId to set to Nobody Owern; 666 is my standard for "Nobody"
unlink($TempDirectory."/".$FileName);
?>
gotdalife at gmail dot com
25-Sep-2008 02:04
25-Sep-2008 02:04
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
?>
southsentry at yahoo dot com
31-Aug-2008 05:23
31-Aug-2008 05:23
This is in response to alvaro at demogracia dot com
Yes, I found that out and have had to wrap it with is_file:
<?php
if(is_file("$file")) {
unlink("$file");
}
?>
PD
06-Aug-2008 12:07
06-Aug-2008 12:07
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);
?>
alvaro at demogracia dot com
24-Jun-2008 08:18
24-Jun-2008 08:18
It's not mentioned in the manual but unlink() raises a warning when the operation fails.
Guilherme Komel
30-Dec-2007 12:14
30-Dec-2007 12:14
I have founda that trying to delete a file using relative path like the example below does not work.
<?php
$do = unlink("../pics/$fileToDel");
if($do=="1"){
echo "The file was deleted successfully.";
} else { echo "There was an error trying to delete the file."; }
?>
I did not work at all, instead what I had to do was:
<?php
chdir('../pics/');
$do = unlink($fileToDel);
if($do=="1"){
echo "The file was deleted successfully.";
} else { echo "There was an error trying to delete the file."; }
?>
Then it worked !
ayor ATTTTT ayor.biz
20-Dec-2007 02:02
20-Dec-2007 02:02
ggarciaa's post above has already one small error, closedir has to be used even if $DeleteMe is false
<?php
// ggarciaa at gmail dot com (04-July-2007 01:57)
// I needed to empty a directory, but keeping it
// so I slightly modified the contribution from
// stefano at takys dot it (28-Dec-2005 11:57)
// A short but powerfull recursive function
// that works also if the dirs contain hidden files
//
// $dir = the target directory
// $DeleteMe = if true delete also $dir, if false leave it alone
function SureRemoveDir($dir, $DeleteMe) {
if(!$dh = @opendir($dir)) return;
while (false !== ($obj = readdir($dh))) {
if($obj=='.' || $obj=='..') continue;
if (!@unlink($dir.'/'.$obj)) SureRemoveDir($dir.'/'.$obj, true);
}
closedir($dh);
if ($DeleteMe){
@rmdir($dir);
}
}
//SureRemoveDir('EmptyMe', false);
//SureRemoveDir('RemoveMe', true);
?>
james at NOSPAM dot telserco dot com
29-Sep-2007 02:10
29-Sep-2007 02:10
Cheap and dirty example for cleaning a directory of files so many seconds old.
function cleantmp() {
$seconds_old = 3600;
$directory = "/var/tmp";
if( !$dirhandle = @opendir($directory) )
return;
while( false !== ($filename = readdir($dirhandle)) ) {
if( $filename != "." && $filename != ".." ) {
$filename = $directory. "/". $filename;
if( @filemtime($filename) < (time()-$seconds_old) )
@unlink($filename);
}
}
}
rahulnvaidya at gmail dot com
03-Aug-2007 09:36
03-Aug-2007 09:36
ggarciaa's post above has one small error, it will ignore file and directory strings that are evaluated as false (ie. "0")
Fixed code is below (false !==)
<?php
// ggarciaa at gmail dot com (04-July-2007 01:57)
// I needed to empty a directory, but keeping it
// so I slightly modified the contribution from
// stefano at takys dot it (28-Dec-2005 11:57)
// A short but powerfull recursive function
// that works also if the dirs contain hidden files
//
// $dir = the target directory
// $DeleteMe = if true delete also $dir, if false leave it alone
function SureRemoveDir($dir, $DeleteMe) {
if(!$dh = @opendir($dir)) return;
while (false !== ($obj = readdir($dh))) {
if($obj=='.' || $obj=='..') continue;
if (!@unlink($dir.'/'.$obj)) SureRemoveDir($dir.'/'.$obj, true);
}
if ($DeleteMe){
closedir($dh);
@rmdir($dir);
}
}
//SureRemoveDir('EmptyMe', false);
//SureRemoveDir('RemoveMe', true);
?>
ggarciaa at gmail dot com
04-Jul-2007 06:00
04-Jul-2007 06:00
<?php
// ggarciaa at gmail dot com (04-July-2007 01:57)
// I needed to empty a directory, but keeping it
// so I slightly modified the contribution from
// stefano at takys dot it (28-Dec-2005 11:57)
// A short but powerfull recursive function
// that works also if the dirs contain hidden files
//
// $dir = the target directory
// $DeleteMe = if true delete also $dir, if false leave it alone
function SureRemoveDir($dir, $DeleteMe) {
if(!$dh = @opendir($dir)) return;
while (($obj = readdir($dh))) {
if($obj=='.' || $obj=='..') continue;
if (!@unlink($dir.'/'.$obj)) SureRemoveDir($dir.'/'.$obj, true);
}
if ($DeleteMe){
closedir($dh);
@rmdir($dir);
}
}
//SureRemoveDir('EmptyMe', false);
//SureRemoveDir('RemoveMe', true);
?>
torch at torchsdomain dot com
22-Nov-2006 08:27
22-Nov-2006 08: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";
}
bmcouto at hotmail dot com
30-Sep-2006 08:30
30-Sep-2006 08:30
<?php
$myFile = "testFile.txt";
$fh = fopen($myFile, 'w') or die("can't open file");
fclose($fh);
?>
Now to delete testFile.txt we simply run a PHP script that is located in the same directory. Unlink just needs to know the name of the file to start working its destructive magic.
<?php
$myFile = "testFile.txt";
unlink($myFile);
?>
The testFile.txt should now be removed.
paul at pes-systems dot net
16-Aug-2006 05:27
16-Aug-2006 05: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
bishop
05-Jun-2005 07:30
05-Jun-2005 07: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 05:05
21-May-2005 05: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 10:50
02-Apr-2005 10: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 06:19
07-Feb-2005 06: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 05:54
14-Sep-2004 05: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 03:22
08-Sep-2004 03:22
To delete files using wildcards:
<?
function delfile($str)
{
foreach(glob($str) as $fn) {
unlink($fn);
}
}
?>
