Czyszczenie/usuwanie katalogu w PHP

4 Comments

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().

Categories: PHP, Zabawy z kodem Tags: Tagi:,

4 thoughts on “Czyszczenie/usuwanie katalogu w PHP”

  1. 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ć :)

  2. Czegoś takiego szukałem, działa świetnie z poziomu Crona.
    Jaką licencję ma ten kod?
    CZy można wykorzystać w komercyjnym projekcie?

    1. @kajetan:
      Podpisz mnie w źródle i kup puszkę Whiskasa jakiemuś bezdomnemu kotu, a możesz robić z tym kodem, co tylko zechcesz :)
      (w przypadku projektów komercyjnych o większej skali, należy ufundować odpowiednio większą ilość kociego żarcia np. dla Fundacji AFN)

  3. Oki
    Skrypt się przyda, nota autorska zachowana i link w źródle do tej strony i kupię whiskasa.

Leave a Reply

Your email address will not be published. Required fields are marked *