2012-09-27 4 views
2

J'utilise php pour supprimer des dossiers contenant des images de messages qui ont été supprimés. J'utilise le code ci-dessous que j'ai trouvé en ligne et fait du bon travail.php supprimer un dossier spécifique et tout son contenu

Je veux savoir comment je peux supprimer seulement un dossier spécifique dans un dossier quand il y a d'autres dossiers dedans. Lorsque j'utilise le code ci-dessous, comment est-il possible de faire cela? Utilisation de:/dev/images/norman/8 -> ne supprime pas le dossier 8 Utilisation:/dev/images/norman/-> supprimera tous les dossiers

Eg: 
/dev/images/norman/8 -> I need to delete only this folder 
/dev/images/norman/9 
/dev/images/norman/10 
/dev/images/norman/11 
/dev/images/norman/12 

<?php 
$path = $_SERVER['DOCUMENT_ROOT'].'/dev/images/norman/8'; 

emptyDir($path); 

function emptyDir($path) { 

    // INITIALIZE THE DEBUG STRING 
    $debugStr = ''; 
    $debugStr .= "Deleting Contents Of: $path<br /><br />"; 

    // PARSE THE FOLDER 
    if ($handle = opendir($path)) { 

     while (false !== ($file = readdir($handle))) { 

      if ($file != "." && $file != "..") { 

       // IF IT"S A FILE THEN DELETE IT 
       if(is_file($path."/".$file)) { 

        if(unlink($path."/".$file)) { 
        $debugStr .= "Deleted File: ".$file."<br />"; 
        } 

       } else { 

        // IT IS A DIRECTORY 
        // CRAWL THROUGH THE DIRECTORY AND DELETE IT'S CONTENTS 

        if($handle2 = opendir($path."/".$file)) { 

         while (false !== ($file2 = readdir($handle2))) { 

          if ($file2 != "." && $file2 != "..") { 
           if(unlink($path."/".$file."/".$file2)) { 
           $debugStr .= "Deleted File: $file/$file2<br />";  
           } 
          } 

         } 

        } 

        if(rmdir($path."/".$file)) { 
        $debugStr .= "Directory: ".$file."<br />"; 
        } 

       } 

      } 

     } 

    } 
    echo $debugStr; 
} 

?> 
+0

essayer,/dev/images/norman/8/ – FirmView

+0

@FirmView C'est tout supprimer sous le dossier 8, mais pas le dossier 8 – Norman

+0

avez-vous essayé la solution que j'ai postée? – FirmView

Répondre

5
<?php 

delete_directory($dirname) { 
    if (is_dir($dirname)) 
     $dir_handle = opendir($dirname); 
    if (!$dir_handle) 
     return false; 
    while($file = readdir($dir_handle)) { 
     if ($file != "." && $file != "..") { 
     if (!is_dir($dirname."/".$file)) 
      unlink($dirname."/".$file); 
     else 
      delete_directory($dirname.'/'.$file);  
     } 
    } 
    closedir($dir_handle); 
    rmdir($dirname); 
    return true; 
} 
?> 

si vous utilisez, la version 5.1 et plus,

<?php 
function deleteDir($dir) { 
    $iterator = new RecursiveDirectoryIterator($dir); 
    foreach (new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST) as $file) 
    { 
     if ($file->isDir()) { 
     rmdir($file->getPathname()); 
     } else { 
     unlink($file->getPathname()); 
     } 
    } 
    rmdir($dir); 
} 

deleteDir("temporary"); 
?> 
+0

d'abord tout le contenu du dossier sera supprimé. À la fin, le dossier sera supprimé. – FirmView

2

Vous voulez entendre parler rmdir.

if(is_file($path."/".$file)) { 

    if(unlink($path."/".$file)) { 
    $debugStr .= "Deleted File: ".$file."<br />"; 
    } 

} else { 

    if(rmdir($path."/".$file)) { 
     $debugStr .= "Deleted Directory: ".$file."<br />"; 
    } 

} 

EDIT: comme rmdir ne peut gérer dirs vides, vous pouvez utiliser cette solution comme indiqué dans les commentaires de la page de rmdir:

function rrmdir($dir) { 
    foreach(glob($dir . '/*') as $file) { 
     if(is_dir($file)) 
      rrmdir($file); 
     else 
      unlink($file); 
    } 
    rmdir($dir); 
} 

Il vient supprime récursive tout $dir, puis se débarrasse de lui-même répertoire .

+0

rmdir ne peut supprimer que des répertoires vides. – S3Mi

+0

@ S3Mi mon mauvais, je vais fournir une solution récursive. – moonwave99

0

Vous pouvez utiliser les commandes système ex. exec("rm -rf {$dirPath}"); ou si vous voulez le faire par PHP, vous devez aller récursive, les boucles ne le feront pas correctement.

public function deleteDir($path) { 

    if ($handle = opendir($path)) { 

     while (false !== ($file = readdir($handle))) { 

      if ($file != "." && $file != "..") { 

       // IF IT"S A FILE THEN DELETE IT 
       if(is_file($path."/".$file)) { 

        if(unlink($path."/".$file)) { 
         $debugStr .= "Deleted File: ".$file."<br />"; 
        } 

       } else { 
        deleteDir($path."/".$file."/"); 
        rmdir($path."/".$file); 
       } 
      } 
     } 
    } 
} 

Quand j'utilisant le code ci-dessous, comment est-il possible de le faire? Utilisation de: /dev/images/norman/8 -> ne supprime pas le dossier 8 Utilisation: /dev/images/norman/-> supprimera tous les dossiers

Je pense que votre problème est que vous êtes absent "/" à la fin de "/ dev/images/norman/8"

0

J'ai ajouté une $exclude param à votre fonction, ce param c'est un tableau avec les noms des répertoires que vous souhaitez exclure d'être supprimés, comme ceci:

$path = $_SERVER['DOCUMENT_ROOT'].'/dev/images/norman/'; 

emptyDir($path); //will delete all under /norman/ 
emptyDir($path, array('8')); //will delete all under /norman/ except dir 8 
emptyDir($path, array('8','10')); //will delete all under /norman/ except dir 8 and 10 

function emptyDir($path,$exclude=false) { 

    // INITIALIZE THE DEBUG STRING 
    $debugStr = ''; 
    $debugStr .= "Deleting Contents Of: $path<br /><br />"; 
    if (!$exclude) { 
     $exclude = array(); 
    } 

    // PARSE THE FOLDER 
    if ($handle = opendir($path)) { 

     while (false !== ($file = readdir($handle))) { 

      if ($file != "." && $file != "..") { 

       // IF IT"S A FILE THEN DELETE IT 
       if(is_file($path."/".$file)) { 

        if(unlink($path."/".$file)) { 
        $debugStr .= "Deleted File: ".$file."<br />"; 
        } 

       } else if (!in_array($file, $exclude)) { 

        // IT IS A DIRECTORY 
        // CRAWL THROUGH THE DIRECTORY AND DELETE IT'S CONTENTS 

        if($handle2 = opendir($path."/".$file)) { 

         while (false !== ($file2 = readdir($handle2))) { 

          if ($file2 != "." && $file2 != "..") { 
           if(unlink($path."/".$file."/".$file2)) { 
           $debugStr .= "Deleted File: $file/$file2<br />";  
           } 
          } 

         } 

        } 

        if(rmdir($path."/".$file)) { 
        $debugStr .= "Directory: ".$file."<br />"; 
        } 

       } 

      } 

     } 

    } 
    echo $debugStr; 
} 
0
$path='./ggg'; 
rrmdir($path); 
function rrmdir($dir) { 
if (is_dir($dir)) { 
$objects = scandir($dir); 
foreach ($objects as $object) { 
    if ($object != "." && $object != "..") { 
    if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object); 
    } 
} 
reset($objects); 
rmdir($dir); 
} 
} 
Questions connexes