Bonjour à toutes et à tous

Je sais ce sujet à surement déja été abordé mais il me semble raisonnablement avoir tout essayé depuis deux jours je suis hébergé chez ovh.

voici le code

$dossier_traite = "../doc/".$data4['tatoo'];

$repertoire = opendir($dossier_traite); // On définit le répertoire dans lequel on souhaite travailler.

while (false !== ($fichier = readdir($repertoire))) // On lit chaque fichier du répertoire dans la boucle.
{
$chemin = $dossier_traite."/".$fichier; // On définit le chemin du fichier à effacer.

// Si le fichier n'est pas un répertoire…
if ($fichier != ".." AND $fichier != "." AND !is_dir($fichier))
       {
       unlink($chemin); // On efface.
       }
}
closedir($repertoire); 

Hé bien cela ne suprime pas ce qu'il y a dans

$data4['tatoo']

c'est dingue ...

description de l'aborescence :

../doc/$data4['tatoo']/dossier1
../doc/$data4['tatoo']/ dossier2
../doc/$data4['tatoo']/dossier3/image.png
../doc/$data4['tatoo']/dossier3/image2.png
../doc/$data4['tatoo']/dossier4

et il faudrais tout supprimer pour ne garde que ../doc

24 réponses


flan
Réponse acceptée

Tu dois partir sur quelques chose de recursif (j'ai adapté ton code pour que cela marche et que je puisse faire les tests en local, tu n'as plus grand chose à modifier) :

<?php

function recursive_unlink($dossier_traite)
{
    foreach(glob($dossier_traite . '/*') as $file)
    {
      is_dir($file) ? recursive_unlink($file) : unlink($file);
    }
    rmdir($dossier_traite);
}

$data4['tatoo'] = 'sous-doc';
$dossier_traite = "doc/".$data4['tatoo'];

recursive_unlink($dossier_traite);

Fais juste attention au contenu de $data4['tatoo'], s'il vient de l'utilisateur ! Si jamais il peut utiliser des caractères comme .., tu risques d'avoir des surprises ;-)

Salut,

C'est parce que tu ne précise nul par le fichier à effacer dans ta boucle.
Tu fais seulement un unlink($chemin);, or il te faut préciser le fichier à supprimer:

    $filepath = $chemin . $fichier;
    chmod($filepath, 0755);
    unlink($filepath);

merci betaWeb je teste dessuite

voici ce que j'ai mantenant :

$dossier_traite = "../doc/".$data4['tatoo'];

chmod($dossier_traite, 0755);

$repertoire = opendir($dossier_traite); // On définit le répertoire dans lequel on souhaite travailler.

while (false !== ($fichier = readdir($repertoire))) // On lit chaque fichier du répertoire dans la boucle.
{
$chemin = $dossier_traite."/".$fichier; // On définit le chemin du fichier à effacer.

// Si le fichier n'est pas un répertoire…
if ($fichier != ".." AND $fichier != "." AND !is_dir($fichier))
       {
       unlink($chemin); // On efface.
       }
}
closedir($repertoire); 

unlink($dossier_traite);        

le dossier et ce qu'il contient sont toujours là ?!

J'ai essayé en mettant le chmod à 777 sa change rien

je viens de constater que les sous dossier et les fichier restent à 705 peut être qu'il faudrais essayer de tout mettre en 777

Et comme ça ?

$dossier_traite = "../doc/".$data4['tatoo'];

chmod($dossier_traite, 0755);
$repertoire = opendir($dossier_traite); // On définit le répertoire dans lequel on souhaite travailler.

while (false !== ($fichier = readdir($repertoire))) { // On lit chaque fichier du répertoire dans la boucle.
// Si le fichier n'est pas un répertoire…
    if ($fichier != ".." AND $fichier != "." AND !is_dir($fichier)) {
        $chemin = $dossier_traite."/".$fichier; // On définit le chemin du fichier à effacer.       
        chmod($chemin, 0755);
        unlink($chemin); // On efface.
       }
}
closedir($repertoire); 
unlink($dossier_traite);  

ok je teste dessuite

l'arborescence est toujours là

je remarque ceci :

../doc/$data4['tatoo']/dossier1 -> est en 755
../doc/$data4['tatoo']/ dossier2 -> est en 755
../doc/$data4['tatoo']/dossier3/image.png -> est en 604
../doc/$data4['tatoo']/dossier3/image2.png -> est en 604
../doc/$data4['tatoo']/dossier4 -> est en 755

je regarde pour pouvoir tout mettre en 777 on sais jamais

Ah mais y'a des dossiers dans le dossier principal ? Il te faut récupérer la liste des dossiers et fichiers en amont, pour ensuite faire des opérations dessus alors.

oui il y a des dossiers et dans certains de ces dossiers il y a des fichiers

Je viens de changer les permissions à la main pour aller plus vite et l'arborescence est encore là

Donc il doit y avoir un soucis quelque part dans ta boucle. Es-tu sur que le chemin vers tes fichiers est bon ?

sûr et certain car j'ai testé en mettant un echo coucou et il c'est affiché.
Je pense à un truc tu sais il faudrais peux être mette le path complet mince je me souviens qu'il existe un truc sur ça je regarde

$path = $_SERVER['DOCUMENT_ROOT'] . '/folder/file.jpg';

je teste ça aussi sais t'on jamais

j'ai testé avec ça mais il y a une sorte de chargement très long bizarre donc ç ane doit pas être la solution

$dossier_traite = $_SERVER['DOCUMENT_ROOT'] . "../doc/".$data4['tatoo'];

chmod($dossier_traite, 0777);
$repertoire = opendir($dossier_traite); // On définit le répertoire dans lequel on souhaite travailler.

while (false !== ($fichier = readdir($repertoire))) { // On lit chaque fichier du répertoire dans la boucle.
// Si le fichier n'est pas un répertoire…
    if ($fichier != ".." AND $fichier != "." AND !is_dir($fichier)) {
        $chemin = $dossier_traite."/".$fichier; // On définit le chemin du fichier à effacer.       
        chmod($chemin, 0777);
        unlink($chemin); // On efface.
       }
}
closedir($repertoire); 
unlink($dossier_traite); 

merci flan je teste dessuite

L'arborescence est toujours là c'est une histoire de fou ce truc. Oui $data4['tatoo'] est simplement le nom d'un dossier nommé par le serveur, j'aurais pu le nommer dossier1 par exemple. De ce coté là pas de soucis je pense.

Envoie le code que tu as fait ?
J'ai testé de mon côté et ça marchait :\

@utilisateur: Je pense qu'il y a un soucis au niveau du chemin. Est-ce que le log d'erreurs PHP t'apprend qqch ?

Commence par faire un unlink sur un fichier en particulier pour éliminer les pb de droits.
l'utilisateur de php c'est www-data donc Other (a moins que tes fichiers aient comme propriétaire www-data)
il faut le droit en écriture pour 'Other' (c-a-d le 3em chiffre) en gros le 3em chiffre doit se terminer par 7 ou 6

ok je vois tout ça et je fait un retour

bon j'ai épuré le code de la page en question pour ne garder que l'essentiel + j'ai créé une arborescence :
../test/doc1
../test/doc2
../test/doc3
../test/doc4
../test/test.txt

et puis j'ai lancé ce code

<?php

$chemin = "../doc/test/";
$fichier = "test.txt";  
$dossier_traite = $chemin.$fichier;

chmod($dossier_traite, 0777);

/*
$repertoire = opendir($dossier_traite); // On définit le répertoire dans lequel on souhaite travailler.

while (false !== ($fichier = readdir($repertoire))) { // On lit chaque fichier du répertoire dans la boucle.
// Si le fichier n'est pas un répertoire…
    if ($fichier != ".." AND $fichier != "." AND !is_dir($fichier)) {
        $chemin = $dossier_traite."/".$fichier; // On définit le chemin du fichier à effacer.       
        chmod($chemin, 0777);
        unlink($chemin); // On efface.
       }
}
closedir($repertoire); 
unlink($dossier_traite);  

*/
unlink($dossier_traite);  
?>

<html>
<head>
<title></title>
</head>
<body >
test test
</body>
</html>

après le refraichissement de cette page le fichier test.txt à été supprimé

../test/doc1
../test/doc2
../test/doc3
../test/doc4

Sauf que l'arborescence dans le répertoire "test" est comprosé de dossiers et de fichiers donc qu'est ce que je dois mettre dans cette ligne

$dossier_traite = $chemin.$fichier;

puisque je veux supprimer des dossiers et des fichiers, j'indique juste le chemin ?

Tu dois rmdir() les dossiers, pas les unlink(), cf. ce que je t'ai envoyé...

ah ok excuse flan je teste