Cancellare una cartella piena

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
Salve, avrei l'esigenza di cancellare una cartella piena dando un comando action.

Lo faccio con questo codice

PHP:
$cartella = 'install/'; 

		if ((isset($_POST['Elimina'])) && ($action == "scrivi")){
		
			function rrmdir($dir) 
				{ 
				$return = array(); 
				if (is_dir($dir))  
					{ 
					$return[] = 'Trovata cartella: '.$dir; 
					$objects = scandir($dir); 
					foreach ($objects as $object)  
						{ 
						if ($object != "." && $object != "..")  
							{ 
							if (filetype($dir."/".$object) == "dir")  
								{ 
								$return[] = 'Trovata sottocartella: '.$dir."/".$object; 
								rrmdir($dir."/".$object);  
								} 
							else 
								{ 
								$return[] = 'Trovato file: '.$dir."/".$object; 
								unlink($dir."/".$object); 
								} 
							} 
						} 
					reset($objects); 
					rmdir($dir); 
					} 
				else 
					{ 
					$return[] = 'La cartella '.$dir.' non esiste'; 
					} 
				return $return; 
				}  

			$settare_cartella = 'install'; 
			$esegui_cancellazione = rrmdir($settare_cartella); 
			foreach($esegui_cancellazione as $kk => $vv) 
			{ 
			echo $vv.'<br />'; 
			}
			
			if (!is_dir($cartella)){
			
				echo "<p><font color='green'>Successo</font> - La cartella e i file contenuti in essa sono stati eliminati correttamente!</p>";
				header("Refresh: 4; url=" . $_SERVER["PHP_SELF"]);
			
			} elseif (is_dir($cartella) || !is_writable($cartella)){
				
				echo "<p><font color='red'>Errore</font> - Impossibile eliminare la cartella!</p>\n";
				echo "<p><font color='red'>Errore</font> - La cartella 'install' non risulta scrivibile!</p>\n";
				echo "Verificare i permessi di lettura/scrittura CHMOD e riprovare.</p>\n";
				echo "La visualizzazione di quest'errore può comportare errori durante l'installazione. Prego correggere i permessi dei file e procedere con un'installazione pulita.</p>\n";				
				die;
			}			
			
		}

Il codice funziona ma credo che non sia ottimizzato per nulla, soprattutto quando tento di gestire gli errori. Qualcuno può darmi una mano?

Soprattutto questa parte qui non mi è chiara
PHP:
            $settare_cartella = 'install';  
            $esegui_cancellazione = rrmdir($settare_cartella);  
            foreach($esegui_cancellazione as $kk => $vv)  
            {  
            echo $vv.'<br />';  
            }

la funzione l'ho presa da php.net
 
Ultima modifica:
Più che altro non è per niente moderna:
PHP:
function removeDirectory($dir)
{
    $iterator = new RecursiveDirectoryIterator($dir);
    $iterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST);

    foreach ($iterator as $path) {
        if ($path->isDir()) {
            rmdir((string)$path);
        } else {
            unlink((string)$path);
        }
    }
}
 
Più che altro non è per niente moderna:
PHP:
function removeDirectory($dir)
{
    $iterator = new RecursiveDirectoryIterator($dir);
    $iterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST);

    foreach ($iterator as $path) {
        if ($path->isDir()) {
            rmdir((string)$path);
        } else {
            unlink((string)$path);
        }
    }
}

Oh ti ringrazio effettivamente il codice è molto molto compatto, l'altro anche se vecchio funzionava bene, credo che userò questo che mi hai postato.
 
Oh ti ringrazio effettivamente il codice è molto molto compatto, l'altro anche se vecchio funzionava bene, credo che userò questo che mi hai postato.

Non riesco ad applicare la funzione:

Ho fatto così:
PHP:
if ((isset($_POST['Elimina'])) && ($action == "scrivi")){
		
			function removeDirectory($cartella) { 
				$iterator = new RecursiveDirectoryIterator($cartella); 
				$iterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST); 

				foreach ($iterator as $path) { 
					if ($path->isDir()) { 
						rmdir((string)$path); 
					} else { 
						unlink((string)$path); 
					} 
				} 
			}
			
			if (!is_dir($cartella)){
		
				echo "<p><font color='green'>Successo</font> - La cartella e i file contenuti in essa sono stati eliminati correttamente!</p>";
				header("Refresh: 8; url=" . $_SERVER["PHP_SELF"]);
			
			} elseif (is_dir($cartella) || !is_writable($cartella)){
			
				echo "<p><font color='red'>Errore</font> - Impossibile eliminare la cartella!</p>";
				echo "<p><font color='red'>Errore</font> - La cartella '$cartella' non risulta scrivibile!</p>";
				echo "<p>Verificare i permessi di lettura/scrittura CHMOD e riprovare.</p>";
				echo "<p>La visualizzazione di quest'errore può comportare errori durante l'installazione. Prego correggere i permessi dei file e procedere con un'installazione pulita.</p>";

			}			
			
		}

Ma purtroppo da sempre il messaggio d'errore.
$cartella è il percorso della cartella da eliminare:
PHP:
$cartella = 'install/';
 
Aggiungi alla fine della funzione:
PHP:
unlink($cartella);
Altrimenti lascia la cartella vuota.

Niente da fare, errore!

PHP:
	    function removeDirectory($cartella) {  
                $iterator = new RecursiveDirectoryIterator($cartella);  
                $iterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST);  

                foreach ($iterator as $path) {  
                    if ($path->isDir()) {  
                        rmdir((string)$path);  
                    } else {  
                        unlink((string)$path);  
                    }  
                }  
            }
			
			unlink($cartella);
L'errore è:
Warning: unlink(install) [function.unlink]: Is a directory in /home/*******/public_html/index.php on line 92

Ho provato a sostituire unlink con rmdir, ma mi dice che la cartella è piena e non può essere cancellata .-.
 
Ho apportato qualche modifica e l'ho testata:
PHP:
function removeDirectory($directory)
{
    $iterator = new RecursiveDirectoryIterator($directory);
    $iterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST);

    foreach ($iterator as $path) {
        if (in_array($path->getBasename(), array('.', '..'))) {
            continue;
        }

        if ($path->isDir()) {
            rmdir((string)$path);
        } else {
            unlink((string)$path);
        }
    }

    rmdir($directory);
}
 
Ho apportato qualche modifica e l'ho testata:
PHP:
function removeDirectory($directory)
{
    $iterator = new RecursiveDirectoryIterator($directory);
    $iterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST);

    foreach ($iterator as $path) {
        if (in_array($path->getBasename(), array('.', '..'))) {
            continue;
        }

        if ($path->isDir()) {
            rmdir((string)$path);
        } else {
            unlink((string)$path);
        }
    }

    rmdir($directory);
}

Non capisco comunque non va! Ho cambiato il file $directory con $cartella che è richiamato così $cartella = 'install';
 
Non capisco comunque non va! Ho cambiato il file $directory con $cartella che è richiamato così $cartella = 'install';

Ho continuato a documentarmi ma non capisco perchè non vada.... Ho pensato che avessi una versione datata di php invece ho "PHP Version 5.2.17"

Su php.net porta

5.2.11, 5.3.1 Added RecursiveDirectoryIterator::FOLLOW_SYMLINKS

Avendo la 5.2.17 dovrei rientrare.......

Ma per ora continua a funzionarmi solo quella che ho postato per primo.
 
Ultima modifica:
Nessun errore è questo il problema....

Ho fatto in questo modo per riportare gli errori:

PHP:
$cartella = 'install'; 

		if ((isset($_POST['Elimina'])) && ($action == "scrivi")){
			
			//riporta, se esiste, qualunque errore.
			error_reporting(E_ALL);
			error_reporting (E_NOTICE);
			
			function removeDirectory($cartella) 
			{ 
				$iterator = new RecursiveDirectoryIterator($cartella); 
				$iterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST); 

				foreach ($iterator as $path) { 
					if (in_array($path->getBasename(), array('.', '..'))) { 
						continue; 
					} 

					if ($path->isDir()) { 
						rmdir((string)$path); 
					} else { 
						unlink((string)$path); 
					} 
				} 

				rmdir($cartella); 
			}  
			
			
		}

Ho aggiunto

//riporta, se esiste, qualunque errore.
error_reporting(E_ALL);
error_reporting (E_NOTICE);

Ma la sintassi di $cartella è corretta?

$cartella = 'install';

Oppure devo aggiungerci lo / finale in modo da essere:

$cartella = 'install/';


EDIT: Per completezza ti posto il codice funzionante ma non ottimizzato:.

PHP:
$cartella = 'install';

		if ((isset($_POST['Elimina'])) && ($action == "scrivi")){
		
			function rrmdir($dir){ 
				
				$return = array(); 
				
				if (is_dir($dir)){ 

					$return[] = '• Trovata cartella: '.$dir; 
					$objects = scandir($dir); 
					
					foreach ($objects as $object){
					
						if ($object != "." && $object != ".."){
						
							if (filetype($dir."/".$object) == "dir"){
							
								$return[] = '• Trovata sottocartella: '.$dir."/".$object; 
								rrmdir($dir."/".$object);  
							} else {
							
								$return[] = '• Trovato file: '.$dir."/".$object; 
								unlink($dir."/".$object); 
							} 
						} 
					} 
					reset($objects); 
					rmdir($dir); 
				} else { 
					$return[] = '• La cartella '.$dir.' non esiste'; 
				} 
				
				return $return; 
			} 
			
			$esegui_cancellazione = rrmdir($cartella); 
			
			foreach($esegui_cancellazione as $kk => $vv){ 
				echo $vv.'<br />'; 
			}
			
			if (!is_dir($cartella)){
		
				echo "<p><font color='green'>Successo</font> - La cartella e i file contenuti in essa sono stati eliminati correttamente!</p>";
				header("Refresh: 8; url=" . $_SERVER["PHP_SELF"]);
			
			} elseif (is_dir($cartella) || !is_writable($cartella)){
			
				echo "<p><font color='red'>Errore</font> - Impossibile eliminare la cartella!</p>";
				echo "<p><font color='red'>Errore</font> - La cartella '$cartella' non risulta scrivibile!</p>";
				echo "<p>Verificare i permessi di lettura/scrittura CHMOD e riprovare.</p>";
				echo "<p>La visualizzazione di quest'errore può comportare errori durante l'installazione. Prego correggere i permessi dei file e procedere con un'installazione pulita.</p>";

			}

Alla fine il codice riportato su funziona, però averne uno ottimizzato penso sia meglio anche per questione di chiarezza se poi si va a modificare qualcosa...
 
Ultima modifica:
O.o ho pensato ci fosse qualche errore nella pagina index.php così ho inserito "error_reporting(E_ALL);" ad inizio pagina..... Il fatto è che mi porta un errore che non viene riportato.... ma che, secondo me non dovrebbe essere un errore (anche perchè funziona):

Se non ti secca dare un occhio ti posto (a questo punto) l'intera index:

PHP:
<?php 

//riporta, se esiste, qualunque errore.
error_reporting(E_ALL);

$cartella = 'install'; 
$filename = 'php/connessione.php';   

//se c'è sia la cartella di installazione che il file di configurazione
if (is_dir($cartella) && file_exists($filename)) {

//termino l'installazione cancellando o rinominando 
//la cartella di installazione oppure ricomincio l'installazione
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="it" lang="it">
<head>

<title>Installer!</title> 
<link rel="icon" href="img/favicon.ico" />
<meta name="DC.Language" scheme="RFC1766" content="Ita">
<meta HTTP-EQUIV="Imagetoolbar" Content="no">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

<link rel="stylesheet" type="text/css" href="install/css/step.css">

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js"></script>
<script>
	$(function() {
		$(".meter > span").each(function() {
			$(this)
				.data("origWidth", $(this).width())
				.width(0)
				.animate({
					width: $(this).data("origWidth")
				}, 1200);
		});
	});
</script>

</head>

<body>

<div id="form">

<?php

$action = htmlspecialchars($_GET['action'], ENT_QUOTES);

if (!$action){

?>

<h1>5. Installazione terminata!</h1><div class="meter animate"><span style="width: 100%"><span></span></span></div>

<form name="modulo2" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>?action=scrivi" method="post" enctype="multipart/form-data" >
			
L'installazione è stata completata con successo.<br />
Per motivi di sicurezza si consiglia vivamente di eliminare la cartella d'installazione.<br />
Se non lo si ritiene opportuno è possibile rinominarla con un nome del tutto casuale tuttavia tale procedura è sconsigliata.
<br />
<br />

<div id="bottons">
			<input class="casella"  type="submit" id="submit" name="Elimina" value="Elimina">
			<input class="casella" type="submit" id="submit" name="Rinomina" value="Rinomina">
			<input class="casella" type="submit" id="submit" name="Reinstalla" value="Reinstalla">
</div>	
</form> 
</div>
</body>
</html>

<?php
}//fine dell'action

		if ((isset($_POST['Elimina'])) && ($action == "scrivi")){
		
			function rrmdir($dir){ 
				
				$return = array(); 
				
				if (is_dir($dir)){ 

					$return[] = '• Trovata cartella: '.$dir; 
					$objects = scandir($dir); 
					
					foreach ($objects as $object){
					
						if ($object != "." && $object != ".."){
						
							if (filetype($dir."/".$object) == "dir"){
							
								$return[] = '• Trovata sottocartella: '.$dir."/".$object; 
								rrmdir($dir."/".$object);  
							} else {
							
								$return[] = '• Trovato file: '.$dir."/".$object; 
								unlink($dir."/".$object); 
							} 
						} 
					} 
					reset($objects); 
					rmdir($dir); 
				} else { 
					$return[] = '• La cartella '.$dir.' non esiste'; 
				} 
				
				return $return; 
			} 
			
			$esegui_cancellazione = rrmdir($cartella); 
			
			foreach($esegui_cancellazione as $kk => $vv){ 
				echo $vv.'<br />'; 
			}
			
			if (!is_dir($cartella)){
		
				echo "<p><font color='green'>Successo</font> - La cartella e i file contenuti in essa sono stati eliminati correttamente!</p>";
				header("Refresh: 8; url=" . $_SERVER["PHP_SELF"]);
			
			} elseif (is_dir($cartella) || !is_writable($cartella)){
			
				echo "<p><font color='red'>Errore</font> - Impossibile eliminare la cartella!</p>";
				echo "<p><font color='red'>Errore</font> - La cartella '$cartella' non risulta scrivibile!</p>";
				echo "<p>Verificare i permessi di lettura/scrittura CHMOD e riprovare.</p>";
				echo "<p>La visualizzazione di quest'errore può comportare errori durante l'installazione. Prego correggere i permessi dei file e procedere con un'installazione pulita.</p>";

			}			
			
		}
		
		if ((isset($_POST['Rinomina'])) && ($action == "scrivi")){
			
			$ren = uniqid('',true);
			rename("install/", $ren);   
			
			if (!is_dir($cartella)){
				
				echo "<p><font color='green'>Successo</font> - La cartella è stata rinominata correttamente!</p>";
				header("Refresh: 4; url=" . $_SERVER["PHP_SELF"]);
			
			} elseif (is_dir($cartella) || !is_writable($cartella)){

				echo "<p><font color='red'>Errore</font> - Impossibile rinominare la cartella!</p>";
				echo "<p><font color='red'>Errore</font> - La cartella '$cartella' non risulta scrivibile!</p>";
				echo "<p>Verificare i permessi di lettura/scrittura CHMOD e riprovare.</p>";
				echo "<p>La visualizzazione di quest'errore può comportare errori durante l'installazione. Prego correggere i permessi dei file e procedere con un'installazione pulita.</p>";

			}
		}
		
		if ((isset($_POST['Reinstalla'])) && ($action == "scrivi")){
			
			if (!is_dir($cartella)){
			
				echo "<p><font color='red'>Errore</font> - Impossibile procedere alla reinstallazione. La cartella '$cartella' non esiste o è stata rinominata!</p>\n";
				echo "Per risolvere quest'errore ricaricare la cartella di installazione o rinominarla in '$cartella'.";
				die;
				
			} else {
				
				echo "<p><font color='green'>Successo</font> - L'installazione ripartirà nuovamente tra 5 secondi.<br /><br />Attendere....</p>";
				header("Refresh: 5; url=install/");
			}
		}
		
    } elseif (is_dir($cartella) && !file_exists($filename)) {//se c'è solo la cartella di intallazione ma non esiste il file di configurazione 

        header("location: install/"); //procedi all'installazione 
         
    } elseif (!is_dir($cartella) && file_exists($filename)){ //se non c'è la cartella di intallazione ma esiste il file di configurazione
     	
		//individuo il dispositivo che visita il sito
		include("./php/Mobile_Detect.php");
		$detect = new Mobile_Detect();

		if ($detect->isMobile() || $detect->isTablet() == true) {
				// any mobile platform
				echo "<script>window.location='m.index.html'</script>";
			}else{
				echo "<script>window.location='form.php'</script>";
			}
         
    } elseif (!is_dir($cartella) && !file_exists($filename)){ //se non c'è la cartella di intallazione e non esiste il file di configurazione
	
		$action2 = htmlspecialchars($_GET['action'], ENT_QUOTES);

		if (!$action2){
	
?>

<html>
<head>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript" src="js/jquery.zclip.js"></script>
<link rel="stylesheet" type="text/css" href="css/errorindex.css" >

</head>

<body>
	<div id="wrapper">	
	<font color='red'><b>Errore</b></font> - Impossibile procedere: non è presente nè la cartella di installazione <font face='Garamond'>'<?php echo"$cartella"; ?>'</font>, nè il file di configurazione <font face='Garamond'>'<?php echo"$filename"; ?>'</font>!<br />
	<br />Per risolvere quest'errore:<br />
	- Se l'applicazione non è stata installata, caricare la cartella <font face='Garamond'>'<?php echo"$cartella"; ?>'</font> nella root dell'applicazione per procedere all'installazione.<br />
	- Se l'applicazione è già stata installata creare il file di connessione al database <font face='Garamond'>'<?php echo"$filename"; ?>'</font>.
	<br />
	<br />
	Creare il file <font face='Garamond'>'<?php echo"$filename"; ?>'</font> tramite l'apposito bottone e personalizzarlo come spiegato qui sotto:
	<br />
	<br />
	<div class="phpcode">
	
	<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>?action=crea" method="post" enctype="multipart/form-data" >
<?php
		highlight_string('
<?php 
/*----------------------------------------------------------
	Verifica che la pagina si trova nella cartella 
	"php/" il nome del file deve essere "connessione.php"
----------------------------------------------------------*/

//Variabili di connessione DA MODIFICARE
$host = "DataBase_host";			 //Inserisci il percorso del tuo host.
$username = "DataBase_username";     //Inserisci il tuo user name 
$password = "DataBase_password";     //Inserisci il la tua password 
$db = "DataBase_nome";  			 // Inserisci il nome del data base 

//Connessione al db: NON MODIFICARE LASCIARE INVARIATO
$conn = @mysql_connect($host,$username,$password) or die ("<p>Errore - Credenziali < $host, $username, $password > non corrette</p><p>MySQL Error: " . mysql_error() . "</p>"); 
$sel = @mysql_select_db($db) or die ("<br /><p>Errore - Nome nome del database $db non corretto!</p><p>MySQL Error: " . mysql_error() . "</p>"); 
?>
		');

?>
	</div>
<input class="button white"  type="submit" id="submit" name="Scrivi" value="Scrivi">
</form>
<?php
}//fine dell'action2

		if ((isset($_POST['Scrivi'])) && ($action2 == "crea")){

		//creo la stringa che verrà scritta in connessione.php
		$string = '<?php 
		/*----------------------------------------------------------
			Verifica che la pagina si trova nella cartella 
			"php/" il nome del file deve essere "connessione.php"
		----------------------------------------------------------*/

		//Variabili di connessione DA MODIFICARE
		$host = "DataBase_host";			 //Inserisci il percorso del tuo host. In genere è localhost
		$username = "DataBase_username";     //Inserisci il tuo user name 
		$password = "DataBase_password";     //Inserisci il la tua password 
		$db = "DataBase_nome";  			 // Inserisci il nome del data base 

		//Connessione al db: NON MODIFICARE LASCIARE INVARIATO
		$conn = @mysql_connect($host,$username,$password) or die ("<p>Errore - Credenziali < $host, $username, $password > non corrette</p><p>MySQL Error: " . mysql_error() . "</p>"); 
		$sel = @mysql_select_db($db) or die ("<br /><p>Errore - Nome nome del database $db non corretto!</p><p>MySQL Error: " . mysql_error() . "</p>"); 
?>';

		//Creo la pagina connessione.php
		$fp = fopen("php/connessione.php", "w");
		
		//apro la pagina connessione.php creata nella cartella "php"
		//scrivo all'interno la stringa $string creata in precedenza
		fwrite($fp, $string);

		//chiudo la pagina
		fclose($fp);
		
		if (file_exists($filename)){
			//stampo l'esito positivo dell'operazione
			echo "<p><font color='green'>Successo</font> - la pagina di connessione al database è stata creata!</p>";
			echo "<p>Adesso non ti resta che personalizzarla con i tuoi parametri.</p>";
		} else {
			echo "<p><font color='red'>Errore</font> - Impossibile creare $filename. Crearlo manualmente!</p>\n";
		}
		}
?>

</div>
</body>
</html>
<?php
    }
?>

l'errore che mi riporta è:
Notice: Undefined index: action in /home/***/public_html/index.php on line 51

Alla linea 51 c'è:

PHP:
$action = htmlspecialchars($_GET['action'], ENT_QUOTES);

?.? ma perchè?????
 
Per forza non va, definisci la funzione senza richiamarla:
PHP:
<?php
function removeDirectory($directory)
{
    $iterator = new RecursiveDirectoryIterator($directory);
    $iterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST);

    foreach ($iterator as $path) {
        if (in_array($path->getBasename(), array('.', '..'))) {
            continue;
        }

        if ($path->isDir()) {
            rmdir((string)$path);
        } else {
            unlink((string)$path);
        }
    }

    rmdir($directory);
}

if ((isset($_POST['Elimina'])) && ($action == "scrivi")) {
    removeDirectory('install');
}
 
Per forza non va, definisci la funzione senza richiamarla:
PHP:
<?php
function removeDirectory($directory)
{
    $iterator = new RecursiveDirectoryIterator($directory);
    $iterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST);

    foreach ($iterator as $path) {
        if (in_array($path->getBasename(), array('.', '..'))) {
            continue;
        }

        if ($path->isDir()) {
            rmdir((string)$path);
        } else {
            unlink((string)$path);
        }
    }

    rmdir($directory);
}

if ((isset($_POST['Elimina'])) && ($action == "scrivi")) {
    removeDirectory('install');
}

Oddio è vero! Veramente non ho parole, perdonami per la perdita di tempo....
 

Discussioni simili