Version complète: sur le forum Webmaster Hub : Supprimer tous les fichiers d'un dossier
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
zimounet
Voila, la question est simple, et j'espere qu'il sera possible d'avoir une solution tout aussi simple smile.gif

Je veux juste une méthode pour supprimer tous les fichier d'un dossier.

Comment procéder?
Spidetra
une première piste avecla fonction unlink de php ( voir les exemple récursif )
zimounet
Pas d'exemple, description vague... Pas super complete la doc php sur le coup... Cela ne m'avance pas encore beaucoup, mais merci pour ta contribution smile.gif

Y a t-il quelqu'un d'autre qui à une idée?
rportal
tu as tous les exemples qu'il faut dans la doc de php:
http://www.php.net/rmdir
zimounet
<mode grognon>
Merci rportal, mais j'ai pas demandé de supprimer un dossier, mais le contenu de celui ci. De plus, a part des contribs en anglais, je ne vois pas d'exemples dans la doc elle même
</mode grognon>
Spidetra
CITATION(zimounet @ lundi 27 mars 2006, 23h26)
Pas d'exemple, description vague... Pas super complete la doc php sur le coup... Cela ne m'avance pas encore beaucoup, mais merci pour ta contribution smile.gif

Y a t-il quelqu'un d'autre qui à une idée?
*



tu pourrais adapter ce bout de code à ton besoin ( source : fct unlink php ) :
CODE

<?php
/**
* rm() -- Vigorously erase files and directories.
*
* _AT_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;
}
?>

Anonymus
Le but du Hub n'est pas de faire le travail à ta place, mais de t'aider lorsque tu rencontres des difficultés.
Tu as dû essayer au moins une fonction décrite dans la doc :
Tu bloques à quel niveau ?
Qu'es ce qu'il te manque pour continuer ?
rportal
CODE
<?PHP

// loc1 is the path on the computer to the base directory that may be moved
define('loc1', 'C:/Program Files/Apache Group/Apache/htdocs', true);

// use this format:
$dir = '[reletive path]';
if(remdir($dir))
rmdir($dir);
else
echo 'There was an error.';

// this function deletes all files and sub directories directories in a directory
// bool remdir( str 'directory path' )
function remdir($dir){

if(!isset($GLOBALS['remerror']))
$GLOBALS['remerror'] = false;

if($handle = opendir(loc1 . $dir)){ // if the folder exploration is sucsessful, continue
while (false !== ($file = readdir($handle))){ // as long as storing the next file to $file is successful, continue
$path = $dir . '/' . $file;
if(is_file(loc1 . $path)){
if(!unlink(loc1 . $path)){
echo '<u><font color="red">"' . $path . '" could not be deleted. This may be due to a permissions problem.</u><br>Directory cannot be deleted until all files are deleted.</font><br>';
$GLOBALS['remerror'] = true;
return false;
}
} else
if(is_dir(loc1 . $path) && substr($file, 0, 1) != '.'){
remdir($path);
_AT_rmdir(loc1 . $path);
}
}
closedir($handle); // close the folder exploration
}

if(!$GLOBALS['remerror']) // if no errors occured, delete the now empty directory.
if(!rmdir(loc1 . $dir)){
echo '<b><font color="red">Could not remove directory "' . $dir . '". This may be due to a permissions problem.</font></b><br>';
return false;
} else
return true;

return false;
} // end of remdir()
?>


La fonction remdir ici presente vide le contenu d'un repertoire et pas le repertoire wink.gif

[mode anglais]C'est plus facile avec[/mode anglais]
zimounet
merci anorci, je vais essayer de me pencher sur ceci.

Toutefois, je n'ai jamais travaillé avec les fichiers en php (et cela ne m'interresse pas vraiment).

Je suis obligé de passer par des trucs compliqué? Il n'y a pas un moyen de dire en une ligne:

"je veux supprimer tout le contenu de tel dossier"?
zimounet
CITATION(Anonymus @ lundi 27 mars 2006, 23h37)
Le but du Hub n'est pas de faire le travail à ta place, mais de t'aider lorsque tu rencontres des difficultés.
Tu as dû essayer au moins une fonction décrite dans la doc :
Tu bloques à quel niveau ?
Qu'es ce qu'il te manque pour continuer ?
*


Bien entendu, et je suis toujours le premier à le dire. bien que je n'aime pas travailler avec les fichiers, comme je l'ai dit précédement, je demandais juste un exemple sur la fonction cité, car je ne sais pas bien manier les fichiers avec php (et donc sans exemple c'est difficilement compréhensible).

En ce qui concerne le code que l'on m'a donné ici, je vais regarder en détail si l'on me répond qu'il n'y a pas de moyen de faire ce que je souhaite faire avec une fonction existante et simple de php smile.gif

Je précise que le message a destination de mportal n'était pas méchant, je ne vais pas gueuler apres les gens qui m'aident (ou tentent de le faire smile.gif )
Spidetra
Dans le bout de code que j'ai copié de la fct unlink a un momment tu as
CODE
return rmdir($fileglob);


met ça en commentaire pour ne pas supprimer le répertoire.
Je suis pas sur qu'il y ait de solution miracle. J'ai regardé rapidement sur PEAR sans trouver de package miracle.

Dans le mesure ou tu veux supprimmer tout les fichiers, je pense que tu peux simplifier le bout de code ( pas de suppression récursive des sous-répertoire ) :

- tu passe en param le nom de ton répertoire
- tu prend comme pattern : *.*
- tu boucle sur la liste des fichiers
- tu fait appel à unlink()
- tu teste juste que tes fichiers ne sont pas des répertoires.
zimounet
CODE
<?PHP
define('loc1', '/home/www/zim/site/', true);

$dir = '/files/RSS/cache';
if(remdir($dir))
rmdir($dir);
else
echo 'There was an error.';

function remdir($dir){

if(!isset($GLOBALS['remerror']))
$GLOBALS['remerror'] = false;

if($handle = opendir(loc1 . $dir)){
while (false !== ($file = readdir($handle))){
$path = $dir . '/' . $file;
if(is_file(loc1 . $path)){
if(!unlink(loc1 . $path)){
echo '<u><font color="red">"' . $path . '" could not be deleted. This may be due to a permissions problem.</u><br>Directory cannot be deleted until all files are deleted.</font><br>';
$GLOBALS['remerror'] = true;
return false;
}
} else
if(is_dir(loc1 . $path) && substr($file, 0, 1) != '.'){
remdir($path);
_AT_rmdir(loc1 . $path);
}
}
closedir($handle);
}

if(!$GLOBALS['remerror'])
if(!rmdir(loc1 . $dir)){
echo '<b><font color="red">Could not remove directory "' . $dir . '". This may be due to a permissions problem.</font></b><br>';
return false;
} else
return true;

return false;
}

/*** Appel de la fonction ***/

remdir($dir)
?>


c'est bon comme ceci?
zimounet
bon sinon plus simple, car j'me galere trop la, comment supprimer un dossier et tout ce qu'il contient? happy.gif

parce que je cherche compliqué, mais c'est peut etre plus simple?
rportal
non ce n'est pas plus simple de supprimer un repertoire avec son contenu car pour supprimer un repertoire, il faut qu'il soit vide biggrin.gif
rportal
voici une fonction qui supprime tout...
CODE
function rm($dir) {
  if(!$dh = _AT_opendir($dir)) return;
  while (($obj = readdir($dh))) {
      if($obj=='.' || $obj=='..') continue;
      if (!@unlink($dir.'/'.$obj)) rm($dir.'/'.$obj);
  }
  _AT_rmdir($dir);
}
zimounet
tout? le dossier et ce qu'il contient?

Par contre faut pas que je fasse de connerie dans l'initiation de la variable $dir happy.gif
rportal
Effectivement quand on supprime quelque chose, il faut toujours faire attention. Mais rassure toi, tu ne peux supprimer que ce que tu as le droit de supprimer... Au pire tout ton site (sauf si tu as une config serveur un peu plus ouverte...).

PS: cette fonction supprime le repertoire ainsi que son contenu.
zimounet
CITATION(rportal @ mardi 28 mars 2006, 00h08)
Au pire tout ton site



Oui hé bien, je vais quand meme faire un backup happy.gif je suis un gros boulet parfois (tout le temps?!), donc on vas prévenir...

Sinon la je suis en train d'essayer une fonction que j'ai trouvé sur le net avant de lire ton précédent message, si ça fonctionne pas j'essayerai la tienne!

En tout cas merci @ toi (et aux autres qui ont contribués à m'aider)

NDLR: c'est super gonflant les fichiers avec php happy.gif
zimounet
Bon (je suis en train de péter un cable avec cette histoire, qui plus est est vraiment ridicule par rapport au reste du truc), j'ai finit pas utiliser ta fonction, seulement ça ne semble avoir aucun effet.

Voici le code que j'ai utilisé:

CODE
function rm($dir) {
 if(!$dh = _AT_opendir($dir)) return;
 while (($obj = readdir($dh))) {
     if($obj=='.' || $obj=='..') continue;
     if (!@unlink($dir.'/'.$obj)) rm($dir.'/'.$obj);
 }
 @rmdir($dir);
}
//appel de la fonction suppression

echo rm("/cache/");




et aucun effet...

$dir doit etre de quel forme? depuis ma home? ou depuis quoi?

La, ce script se trouve dans /monsite/rep/ et le dossier a traiter se trouve à /monsite/rep/cache

Edit: j'ai mis le chemin depuis ma home et cela fonctionne, et ça supprime bien le dossier cache... nickel

merci @ tous! et désolé pour le rafus... blush.gif
rportal
petit point sur les chemins d'acces aux fichiers.

si tu utilises un / au début de ton chemin, tu vas écrire un chemin par rapport au document_root de ton serveur web (http://<ton-domaine/)

si tu ne commences pas par / , ton chemin sera relatif au repertoire courant appelé par l'url.

du coup si tu fais $dir='cache/'; tu références le répertoire cache qui se trouve dans le meme reprtoire que ton script. si tu fais $dir='/cache/'; tu references le repertoire cache qui se trouve dans le repertoire racine de ton serveur web.
Spidetra
Petite question indiscrète :

CODE
$dir = '/files/RSS/cache';


Tu essaye de coder un système de cache pour ton site ?
zimounet
Non, rien a voir smile.gif

Je viens de finir de coder un truc dont j'ai un peu honte smile.gif Mais sur le net, et avec des charognes comme di****net, c'est un peu la loi de la jungle.

<edit:modérateur. Merci de ne pas montrer du doigt>
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.