Ho bisogno di cancellare una cartella con contenuti usando PHP. rmdir()
e unlink()
eliminano le cartelle vuote, ma non sono in grado di eliminare le cartelle con contenuti.Come eliminare una cartella con contenuti usando PHP
risposta
Questa funzione vi permetterà di eliminare qualsiasi cartella (a patto che sia scrivibile) ed è file e sottodirectory.
function Delete($path)
{
if (is_dir($path) === true)
{
$files = array_diff(scandir($path), array('.', '..'));
foreach ($files as $file)
{
Delete(realpath($path) . '/' . $file);
}
return rmdir($path);
}
else if (is_file($path) === true)
{
return unlink($path);
}
return false;
}
O senza ricorsione usando RecursiveDirectoryIterator
:
function Delete($path)
{
if (is_dir($path) === true)
{
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST);
foreach ($files as $file)
{
if (in_array($file->getBasename(), array('.', '..')) !== true)
{
if ($file->isDir() === true)
{
rmdir($file->getPathName());
}
else if (($file->isFile() === true) || ($file->isLink() === true))
{
unlink($file->getPathname());
}
}
}
return rmdir($path);
}
else if ((is_file($path) === true) || (is_link($path) === true))
{
return unlink($path);
}
return false;
}
Ottimo metodo, uomo . Stavo usando il comando più semplice: Php system ("rm -r RESOURCE_PATH"); ?>, ma sfortunatamente alcuni server non consentono il comando di sistema, quindi il tuo (ho scelto il primo) è una sostituzione molto buona e semplice. Grazie Fratello. –
Funziona anche per percorsi relativi? Diciamo che il percorso completo è "/ var/www/html/folder_and_files_to_delete /" E lo script di cancellazione è posto in "/var/www/html/delete_folders_and_files.php". Posso semplicemente prendere "folder_and_files_to_delete" come percorso? – yoano
Mi piace, la migliore risposta – mghhgm
È necessario aggirare il contenuto della cartella (incluso il contenuto di qualsiasi sottocartella) e rimuoverlo per primo.
C'è un esempio qui: http://lixlpixel.org/recursive_function/php/recursive_directory_delete/
Fate attenzione con esso !!!
Si dovrà eliminare tutti i file in modo ricorsivo. Ci sono esempi di funzioni di abbondanza nei commenti della pagina rmdir
manuale:
spero che rmdir cancellerà solo la cartella che non ha contenuti. se ha contenuti non cancellerà la cartella. – Fero
Proprio così Fero - rmdir non rimuoverà una directory che ha contenuti, motivo per cui è necessario eliminare prima qualsiasi contenuto se si vuole eliminare una directory (incluso il contenuto di qualsiasi sottodirectory) – Fenton
Non esiste un'unica funzione integrata in PHP che permetterebbe questo, è necessario scrivere il proprio con rmdir e scollegare.
Un esempio (preso da un commento su php.net docs):
<?
// ensure $dir ends with a slash
function delTree($dir) {
$files = glob($dir . '*', GLOB_MARK);
foreach($files as $file){
if(substr($file, -1) == '/')
delTree($file);
else
unlink($file);
}
rmdir($dir);
}
?>
Che cos'è GLOB_MARK? – Randell
@Randell: GLOB_MARK - Aggiunge una barra a ciascuna directory restituita. –
Ecco uno script che farà proprio quello che serve:
/**
* 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 ([email protected]($dir . '/' . $obj))
{
unlinkRecursive($dir.'/'.$obj, true);
}
}
closedir($dh);
if ($deleteRootToo)
{
@rmdir($dir);
}
return;
}
ho presa da php.net e funziona .
Forse un approccio migliore è utilizzare rm
(se si è sotto linux). Sarebbe andare qualcosa come questo ($root
dovrebbe sempre essere impostato per la vostra TMP directory
per evitare l'eliminazione di file vitali!):
function remove($dir) {
$root = $_SERVER['DOCUMENT_ROOT'].'/tmp/';
if (is_dir($root.$dir)) {
exec('rm -rf '.$root.$dir);
}
}
remove ("/") ... renderà tutto felice :) –
Yikes. I comandi della shell dovrebbero essere evitati. – Volomike
L'ELIMINAZIONE DI FILE COME IN UN'APP WEB DEVE ESSERE EVITATA. DARE PERCORSI RELATIVI PU DEL CANCELLARE QUALSIASI FILE NEL SISTEMA SE L'UTENTE APP HA AUTORIZZATO. – ArunaFromLK
@@ Maerlyn: Ho postato questa domanda in data 26 agosto 2009. Quello che lei ha citato duplicato è stato pubblicato il 28 luglio 2010 .. Credo che tu sappia cosa fare ORA ... Prima di fare qualcosa per favore verifica una volta. – Fero