Jak usunąć plik lub folder?

Riddle

Instrukcja usuwania plików i folderów w PHP, porównanie do usuwania plików i folderów w Bash, informcja nt obsługi plików na poziomie systemu plików.

***

Usuwanie plików i folderów

Usuwanie plików i folderów ze skryptu PHP, nie różni się od usuwania ich ze skryptu Bash (Linux/Unix) lub Command-Line (Windows). Składnia jest delikatnie inna, ale rządzą się tymi samymi prawami i działają w taki sam sposób.

Wstęp

Pokazanie plików w folderze

Żeby pokazać pliki z folderu w którym się znajdujemy, skorzystajmy z polecenia ls -la (list, ang. "lista"). Na swoim komputerze prawdopodobnie zobaczysz wynik podobny do takiego:

root@local:/home/root$ ls -la
total 0
drwxr-xr-x 1 root root 4096 Jun  1 21:38 .
drwxr-xr-x 1 root root 4096 Jun  1 21:38 ..
drwxr-xr-x 1 root root 4096 Jun  1 21:38 folder_z_zawartoscia
-rw-r--r-- 1 root root 0    Jun  1 21:38 plik.txt
drwxr-xr-x 1 root root 4096 Jun  1 21:38 pusty_folder
root@local:/home/root$

Na samej górze zobaczymy tajemnicze . oraz ... Są to dowiązania symboliczne oznaczające aktualny folder oraz folder rodzica. Używa się ich do wskazywania aktualnego folderu bądź folderu rodzica aplikacjom konsolowym, bez konieczności przepisywania ścieżek. Nie jesteśmy w stanie ich usunąć, taka próba skończy się błędem.

Usunięcie plików

Żeby usunąć plik z Basha (lini poleceń Unix) możemy wykonać polecenie rm (remove, ang. "usuń"), przekazując nazwę pliku do usunięcia jako drugi argument.

rm plik.txt

W podobny sposób może usunąć pusty katalog.

rm pusty_folder

Nie możemy jednak w taki sposób usunąć pełnego katalogu, tzn. takiego w którym są inne pliki lub foldery. Na niskim poziomie (tzn. poziomie systemu operacyjnego i systemu plików) usunięcie folderu, bez uprzedniego usunięcia jego zawartości skutkowałoby tym, że zawartość nadal zajmowałaby miejsce na dysku (ponieważ jej nie usunęliśmy). Na szczęście popularne narzędzia takie jak rm lub funkcje w PHP nie pozwalają popełnić nam takiego błędu, a nawet mają opcję żeby rekursywnie usunąć zawartość folderu za nas.

rm -r folder_z_zawartoscia

Usuwanie plików w PHP

W PHP mamy funkcję unlink(). Ciekawskim wyjaśniam, że nazwa "unlink" (ang. "odłącz"), jest bardzo bliska temu jak faktycznie usuwanie jest realizowane na poziomie systemu plików. Nasze drzewo katalogów i plików tak na prawdę składa się z tzw hardlinków oraz symbolic linków (ang. "dowiązanie symboliczne"), (również zwane "symlink" lub "softlink"). Usuwanie plików polega na "odłączaniu" linków, kiedy do zasobu nie wskazuje już żaden link, system plików zwalnia miejsce na dysku.

<?php
unlink('plik.txt');

Usuwanie folderu w PHP

Do usunięcia pustego folderu możemy użyć rmdir():

<?php
rmdir('pusty_folder');

Nie istnieje argument, który możemy przekazać żeby PHP rekursywnie usunął folder, tak jak rm -r w Bashu, musimy to napisać sami.

Rekursywne usuwanie folderu z zawartością w PHP

Oto funkcja usuwająca zawartość folderu, przed usunięciem go:

<?php
function rmDirRecursive($folderName) {
  $dir = opendir($folderName);
  while($file = readdir($dir)) {
    if (!in_array($file, ['.', '..'])) {
      unlink($folderName . DIRECTORY_SEPARATOR . $file);
    }
  }
  closedir($dir);
  rmdir($folderName);
}

Użycie:

<?php
rmDirRecursive("folder_z_zawartoscia");

0 komentarzy