Czyszczenie/usuwanie katalogu w PHP

październik 9th, 2008. 1 komentarz.
Kategorie: PHP, Zabawy z kodem.

Dzisiaj stanąłem przed koniecznością skasowania kilku katalogów i usunięcia zawartości kilku innych. Ponieważ uprawnienia do nich posiadał tylko serwer (użytkownik www, czy jakoś tak), musiałem to zrobić oczywiście z poziomu skryptu.
Doszedłszy do wniosku (po wielu bojach z Google), iż aby usunąć katalog, należy go najpierw opróżnić, w oparciu o kod znaleziony gdzieś w szuwarach Internetu, skonstruowałem własną funkcję, która może komuś się przyda

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*
  EmptyDir, v0.1
  uzycie:
    EmptyDir("nazwakatalogu");
    EmptyDir("nazwakatalogu", false); // (lub 0)
     - skasowanie zawartosci katalogu
    EmptyDir("nazwakatalogu", true); // (lub 1)
     - usuniecie katalogu razem z zawartoscia,
       niekoniecznie w tej kolejnosci
  wartosci zwracane:
    true  - powodzenie
    false - niepowodzenie
*/
function EmptyDir($dirName, $rmDir = false)
{
  if($dirHandle = opendir($dirName)) 
  {
    while(false !== ($dirFile = readdir($dirHandle)))
      if ($dirFile != "." && $dirFile != "..") 
        if(!unlink($dirName . "/" . $dirFile))
          return false;
    closedir($dirHandle); 
    if($rmDir)
      if(!rmdir($dirName))
        return false;
    return true;
  }
  else
    return false;
}

Jak widać, całość opiera się na unlink() (usuwanie pliku) oraz rmdir() (usuwanie pustego katalogu). Podobny przykład można zobaczyć w manualu funkcji rmdir().

Jeden komentarz

marek  dnia wrzesień 23rd, 2009

Problem w tym, że nie wywala podkatalogów. Trzeba zapętlić funkcję w funkcji. To podobno obciąża serwer, ale jest do zrobienia. czyli:

function EmptyDir($dirName, $rmDir = false)
{
  if($dirHandle = opendir($dirName)) 
  {
    while(false !== ($dirFile = readdir($dirHandle)))
      if ($dirFile != "." && $dirFile != "..") 
 
      // tu moje, bo problem z katalogiem wewnątrz
      if(is_dir($dirName . "/" . $dirFile)){EmptyDir($dirName . "/" . $dirFile, true);}
      else
      //koniec mojego z katalogiem wewnątrz
 
        if(!unlink($dirName . "/" . $dirFile))
          return false;
    closedir($dirHandle); 
    if($rmDir)
      if(!rmdir($dirName))
        return false;
    return true;
  }
  else
    return false;
}

edit (WRonX): oczywiście nie ponoszę odpowiedzialności za ten kod, bo nie chciało mi się go przetestować :)

Skomentuj: