2010-08-02 3 views
0

Je souhaite parcourir tous les sous-dossiers d'un dossier particulier et vérifier s'ils contiennent un fichier spécial, sinon supprimer le sous-dossier.Comment parcourir tous les sous-dossiers contenant un fichier spécial?

Prenez cet exemple (file.txt étant le fichier spécial ici):

  • folder_all
    • folder1
      • file.txt
    • dossier2
      • file.txt
    • folder3
      • vide

Parce que "folder3" n'a pas le fichier, je voudrais supprimer .
Et c'est ce que je veux faire. Des idées?

Merci beaucoup!

+2

Que faire si votre sous-dossier n'a pas le fichier spécial, mais qu'il a d'autres sous-dossiers? Voulez-vous toujours le supprimer? –

+0

J'ai fait une règle à suivre.Tous les sous-dossiers seront supprimés s'ils ont un fichier spécial existe.J'ai pensé qu'il suffit de parcourir les dossiers de second niveau, mais à n'importe quel niveau d'entre eux. – qinHaiXiang

Répondre

0
function recursive_delete_if_exists($path,$file) { 
    foreach (glob($path.'/*.*') as $name) 
     if (is_dir($name)) 
     recursive_delete_if_exists($name,$file); 
     elseif ($name==$file) 
     unlink($path); 
} 

recursive_delete_if_exists('/folder_all','file.txt'); 
2

code mis à jour

Vous pouvez utiliser la classe RecursiveDirectoryIterator:

<?php 

$dir = '/path/'; 
$file = '/filetosearch.txt'; 
$paths = array(); 

$i = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)); 

while($i->valid()) { 

    if (!$it->isDot()) { 

     $subpath = $it->getSubPath(); 

     if ($subpath != '') { 
      // if inside a subdirectory 
      // add the subpath in our array flagging it as false 
      if (!array_key_exists($subpath, $paths) $paths[$subpath] = false; 

      // check if it's our file 
      if (substr_compare($i->getSubPathName(), $file, -strlen($file), strlen($file)) === 0) 
       $paths[$subpath] = true; 

    } 

    $it->next(); 
} 

// now check our paths array and delete all false (not containing the file) 
foreach ($paths as $key => $value) 
{ 
    if (!$value) rmdir($dir.$key); 
} 

?> 
+0

+1 pour l'utilisation de SPL –

+0

Ceci n'est qu'une demi-solution. Comment l'OP connaîtra-t-il le nom du dossier à supprimer? Votre solution utilise la valeur par défaut 'LEAVES_ONLY' pour le' RecursiveIteratorIterator', donc elle ne vous indiquera même pas les noms de dossier. – Gordon

+1

@Gordon: mise à jour, merci. – Anax

Questions connexes