[PHP] Directory alleen verwijderen als deze leeg is

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik probeer een functie te schrijven die kijkt of een gegeven directory leeg is en zo ja, deze directory verwijderd en true returned. Als er nog bestanden (of andere directories) in de dir zitten, dan moet de functie false returnen. Ik heb nu dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
 * Remove a directory only when it is empty
 *
 * @param $dir The directoty the users wants to delete
 */
function rm_dir($dir) {
  $handle = opendir($dir);
  while (false !== ($file = readdir($handle))) {
    if (!in_array($file, array('.', '..'))) {
      if (is_dir($dir.'/'.$file)) {
        rm_dir($dir.'/'.$file);
      }
      else {
        return false;
      }
    }
  }
  closedir($handle);
  @rmdir($dir);
  return true;
}

In principe werkt de functie wel, maar ik vraag me af of hij wel goed in elkaar zit. Immers: als er bestanden in de dir zitten, returned de functie false en stopt dan (regel 14). De geopende directory wordt dan volgens mij niet correct weer gesloten. Dat gebeurt pas in regel 18. Ik ben voor het eerst serieus met de filesystem functies van php bezig, en begrijp de werking nog niet helemaal. Ik hoop dat iemand mij kan vertellen of deze functie zo klopt, en zo niet - hoe ik deze kan verbeteren :)

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

een dir kan alleen worden verwijderd als ie leeg is

PHP:
1
2
$weg = @rmdir($dir);
if($weg) { print "ok en weg"; } else { print "niet leeg"; }

[ Voor 69% gewijzigd door Snake op 11-12-2005 21:10 . Reden: schandalige vaut ]

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

Verwijderd

snake903 schreef op zondag 11 december 2005 @ 21:08:
een dir kan alleen worden verwijderd als ie leeg is
en je hebt voldoende rechten en de directory of bestanden in die directory zijn niet in gebruik en ...

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Hij klopt bijna, alleen het punt waarop je je functie recursief aanroept klopt niet. Die call returned namelijk ook een waarde, alleen doe je er niets mee. Beter zou dus dit zijn:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
function rm_dir($dir) {
  $handle = opendir($dir);
  while (false !== ($file = readdir($handle))) {
    if (in_array($file, array('.', '..'))) continue;
    if ( !( is_dir($dir.'/'.$file) && rm_dir($dir.'/'.$file) ) ) {
      return false;
    }
  }
  closedir($handle);
  @rmdir($dir);
  return true;
} 
?>

Zoals je kunt zien heb ik die recursieve call nu binnen het if statement geplaatst, daarbij maak ik dan gebruik van short circuit evaluation. Daarnaast heb ik die eerste controle ook aangepast, zodat ie continue aanroept in plaats van nog een if statement nest. Scheelt weer een keer nesten.

Noushka's Magnificent Dream | Unity