[PHP]Ta bort en map, samt alla filer och mappar den inehåller.

Permalänk
Medlem

[PHP]Ta bort en map, samt alla filer och mappar den inehåller.

Tjenare!

Jag har försökt göra ett script som automatiskt tar bort en mapp, samt alla filer och mappar den inehåller, men har inte lyckats få till det.

Någon som har några tips eller ideer?

/MVH Tomas

Visa signatur

//Toombass

Permalänk
Medlem

Använd exec("rm -rf $mapp");

Visa signatur

I distrust governments because I’ve studied history. Ask Joe this question: who does most of the killing? Who does most of the theft? Even the body-count of the worst criminals and terrorists pales in comparison to the death toll the average government inflicts on its own people. And it is not criminals who tax away 5/12ths of my income. - Eric S Raymond
http://www.css3.se

Permalänk
Hedersmedlem

Skulle snarare rekommendera att använda någon av exempelfunktionerna i kommentarerna på http://se2.php.net/rmdir

Att använda exec() eller system() är någonting man bör undvika.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem
Permalänk
Medlem

hittade en fin funktion där på php.net. Dock undrar jag av ren nyfikenhet varför man inte bör använda exec() eller system(). ?

Visa signatur

//Toombass

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av Toombass
hittade en fin funktion där på php.net. Dock undrar jag av ren nyfikenhet varför man inte bör använda exec() eller system(). ?

Inte portabelt. Samt att det är ett potentiellt säkerhetshål:

php -r 'system("echo foo; echo bar");' foo bar

(med andra ord, om man skickar in en variabel som "defineras" av användaren kan den innehålla typ "giltligt argument; ett elakt kommando")

I och för sig, escapeshellcmd och escapeshellarg finns. Men man bör ändå undvika det. Inte minst för att det är fult att blanda in shellkommandon i kod på det viset.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk

För den kommande OO-versionen av phpFe skrev jag följande (icke-rekursiva) funktion som tar bort filer/mappar och dess innehåll:

//################################# //## >>>> deleteObjects //## Deletes the objects and in case of directories, their contents aswell //## $paths = string|array(paths) - path of objects to rename //################################# function deleteObjects($paths) { // Make sure we're working with an array if (!is_array($paths)) $paths = array($paths); // Array of directories to delete (can't delete directories with contents) $dirs = array(); ##### Iterate through the paths array $numDeleted = 0; for ($i = 0; $i < (count($paths) + $numDeleted); $i++): if (!file_exists($this->bp . $paths[$i])) continue; ##### Queue directory contents for deletion if (is_dir($this->bp . $paths[$i])): // Add a trailing forward slash to the path if missing if (substr($paths[$i], -1) != '/') $paths[$i] .= '/'; // Attempt to open directory if (!$dir = @opendir($this->bp . $paths[$i])): $this->_error("Could not access the directory '{$paths[$i]}'.", E_USER_NOTICE); continue; endif; // Add directory's contents to the queue while (false !== ($obj = @readdir($dir))) if ($obj != '.' && $obj != '..') $paths[] = $paths[$i] . $obj; @closedir($dir); // Queue current directory for deletion array_unshift($dirs, $path[$i]); ##### Delete files elseif (!@unlink($this->bp . $path[$i])): $this->_error("An error occured while trying to delete '{$paths[$i]}'.", E_USER_NOTICE); else: unset($paths[$i]); $numDeleted++; endif; endfor; ##### Remove directories now that they should be empty if (!empty($dirs)): foreach ($dirs as $i => $dir): if (!@rmdir($this->bp . $dir)) $this->_error("An error occured while trying to delete the directory '{$dir}'.", E_USER_NOTICE); else unset($dirs[$i]); endforeach; $paths = array_merge($paths, $dirs); endif; if (count($paths) > 0) return $paths; return true; } //## <<<< deleteObjects //#################################

$this->bp är den absoluta sökvägen som skriptet utgår ifrån och $this->_error() är errorhandlern, men för övrigt bör koden vara självförklarande (hoppas jag i alla fall). Skicka antingen en sökväg till en fil/mapp som sträng eller ett antal sökvägar i en array och dessa tas bort.

Edit: nu har jag ju självklart glömt att lägga till koden för att ta bort mapparna i slutet (har inte prövat koden än då jag fortfarande arbetar med övriga delar av skriptet). Återkommer om ett tag när jag lagt till det.

Edit2: Koden uppdaterad, den bör fungera men jag har inte prövat den. Låt mig veta om den inte funkar som den ska så ska jag se över den