Przydatne funkcje do operacji na plikach część 1
Dzisiaj chciałbym przedstawić Wam kilka przydatnych funkcji, które przydadzą Wam się do operacji na plikach. Są one pomocne gdy chcemy zrobić upload plików dla użytkowników, galerię zdjęć pobieranych bezpośrednio z katalogu na naszym serwerze, czy też po prostu chcemy zabezpieczyć niektóre pliki przed niechcianymi gośćmi.
Basename
Funkcja ta przydaje się zwłaszcza wtedy, kiedy potrzebujemy wyświetlić lub zapisać nazwę pliku bez jego dokładnej ścieżki. Można ją użyć na dwa sposoby:
-
Sposób pierwszy
1 2 3 4 5 6
<?php $sciezka_pliku = '/sciezka/do/pliku/moj_plik.txt'; $nazwa_pliku = basename($sciezka_pliku); print $nazwa_pliku; ?>
Powyższy skrypt powinien wyświetlić:
moj_plik.txt
-
Sposób drugi:
1 2 3 4 5 6
<?php $sciezka_pliku = '/sciezka/do/pliku/moj_plik.txt'; $nazwa_pliku = basename($sciezka_pliku, '.txt'); print $nazwa_pliku; ?>
Tym razem funkcja basename() posiada dwa parametry. Pierwszy się nie zmienił, natomiast drugi to rozszerzenie pliku. Dzięki temu skrypt wyświetli jedynie:
moj_plik
Oczywiście drugi parametr nie musi być rozszerzeniem nazwy pliku. Może to być dowolny ciąg znaków, jakim kończy się plik, np.:
1 2 3 4 5 6
<?php $sciezka_pliku = '/sciezka/do/pliku/moj_plik.txt'; $nazwa_pliku = basename($sciezka_pliku, '_plik.txt'); print $nazwa_pliku; ?>
Wyświetli:
moj
Drugi sposób przydaje się szczególnie, gdy nie chcemy ujawniać rozszerzenia pliku lub jego pełnej nazwy.
Chmod
Czasami zdarza się tak, że musimy dynamicznie zmieniać dostęp do plików. Wtedy przydaje się funkcja chmod(). Pozwala ona zmienić prawa dostępu do plików na podstawie ósemkowej wartości liczbowej, czyli np. 0644, 0755, 0600, itd. Nieprawidłowo natomiast jest wpisywać tam np. 644, czy 700. Użycie funkcji wygląda tak:
1 2 3 4 5 6 | <?php $sciezka_pliku = '/sciezka/do/pliku/moj_plik.txt'; chmod($sciezka_do_pliku, 0755); // Tutaj mogą być jakieś operacje na pliku chmod($sciezka_do_pliku, 0600); ?> |
Powyższy skrypt najpierw ustawia wszystkie prawa dla właściciela pliku oraz możliwość odczytu i wykonania dla innych, następnie mogą wystąpić jakieś operacje na tym pliku, a na sam koniec dostęp do pliku dla właściciela zostaje ograniczony do odczytu i zapisu, a dla innych usuwane są wszelkie prawa.
Oto tabela z interpretacją kodów ósemkowych (źródło: Wikipedia):
| Cyfra | Prawa |
|---|---|
| 0 | Brak praw |
| 1 | Wykonywanie |
| 2 | Pisanie |
| 3 | Wykonywanie i pisanie |
| 4 | Czytanie |
| 5 | Czytanie i wykonywanie |
| 6 | Czytanie i pisanie |
| 7 | Wszystkie prawa |
Kolejność uprawnień jest taka:
- Pierwsza cyfra odpowiada za dodatkowe parametry uprawnień pliku
- Druga cyfra za uprawnienia właściciela pliku
- Trzecia cyfra za uprawnienia grupy
- Czwarta cyfra za uprawnienia zwykłego użytkownika
Dodatkowo muszę nadmienić, iż 0 (zero) na początku wartości chmod jest wymagane przez funkcję, któa akceptuje ten parametr jedynie w formacie ósemkowym.
[...] należy uważać na safe mode który sprawdza czy pliki maja takie same UID jak skrypt który wywołuje zmianę praw i bity lepkości (sticky bits) które definiują przez kogo może być zmieniany/usuwany plik.
Copy
Copy, jak sama nazwa wskazuje służy do kopiowania plików. Ponadto, jeśli plik istnieje, to zostaje nadpisany. Użycie tej funkcji jest proste i oczywiste, podajemy dwa parametry, z czego pierwszy to ścieżka pliku do skopiowania, a drugi to ścieżka, gdzie dany plik ma być skopiowany:
1 2 3 4 5 6 | <?php $sciezka_pliku = '/sciezka/do/pliku/moj_plik.txt'; $skopiuj_do = '/nowa/sciezka/moj_plik_kopia.txt'; copy($sciezka_pliku, $skopiuj_do); ?> |
W ten sposób treść pliku moj_plik.txt zostanie skopiowana do pliku moj_plik_kopia.txt.
Rename
Funkcja ta ma dwie właściwości: pozwala na zmianę nazwy pliku oraz umożliwia przenoszenie pliku do innego katalogu. Działa podobnie jak copy(), z tym, że nie pozostawia pliku źródłowego. Przenoszenie pliku wygląda tak:
1 2 3 4 5 6 | <?php $sciezka_pliku = '/sciezka/do/pliku/moj_plik.txt'; $przenies_do = '/nowa/sciezka/moj_plik.txt'; rename($sciezka_pliku, $przenies_do); ?> |
Natomiast przy zmianie nazwy podawanie ścieżki nie jest wymagane. Wystarczy podać starą i nową nazwę pliku, o ile skrypt znajduje się w tym samym katalogu. W przeciwnym wypadku należy podać pełną ścieżkę.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $plik = 'moj_plik.txt'; $nowy = 'moj_nowy_plik.txt'; rename($plik, $nowy); // LUB $sciezka_pliku = '/sciezka/do/pliku/moj_plik.txt'; $sciezka_nowego = '/sciezka/do/pliku/moj_nowy_plik.txt'; rename($sciezka_pliku, $sciezka_nowego); ?> |
Unlink
Wielu początkujących programistów ma problem ze znalezieniem odpowiedniej funkcji usuwającej pliki. Za to właśnie odpowiada funkcja unlink:
1 2 3 4 5 | <?php $sciezka_pliku = '/sciezka/do/pliku/moj_plik.txt'; unlink($sciezka_pliku); ?> |
Powyższy kod usunie plik moj_plik.txt z podanego katalogu.
[...] można powiedzieć ze jak się go użyje z odpowiednimi wrapperami to można usuwać pliki za pomocą URL’a taka fajna własność.
Dirname
Funkcja podobna do basename(). Od wspomnianej różni ją to, że zwraca nie nazwę pliku ze ścieżki lecz ścieżkę do katalogu, w którym znajduje się wskazany plik.
1 2 3 4 5 6 | <?php $sciezka_pliku = '/sciezka/do/pliku/moj_plik.txt'; $katalog = dirname($sciezka_pliku); print $katalog; ?> |
Powyższy skrypt powinien wyświetlić:
/sciezka/do/pliku
Glob
Glob jest przydatna, kiedy chcemy wyświetlić listę plików, które są ze sobą w jakiś sposób powiązane, np. znajdują się w tym samym katalogu, mają takie same rozszerzenia lub posiadają wspólne cechy w nazwie. Funkcję tą można użyć na kilka sposobów:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php $lista_plikow_1 = glob('pliki/*'); $lista_plikow_2 = glob('galeria/*.jpg'); $lista_plikow_3 = glob('*.html'); foreach ($lista_plikow_1 as $plik) { print $plik . '<br />'; } print '<br />'; foreach ($lista_plikow_2 as $plik) { print '<img src="' . $plik . '" /><br />'; } print '<br />'; foreach ($lista_plikow_3 as $plik) { print basename($plik, '.html') . '<br />'; } ?> |
Powyższy przykład wyświetli kolejno:
- Listę plików z katalogu "pliki"
- Listę plików o rozszerzeniu .jpg z katalogu "galeria"
- Listę nazw plików o rozszerzeniu .html z katalogu ze skryptem
Podsumowanie
To tyle na dziś. Wkrótce dodam kolejne dwie lub trzy części.
Grudzień 7th, 2009 - 17:07
Ty Sebastian, ale jak już podajesz chmod to chociaż napisz jaka jest kolejność dla każdej z cyfry leniu Ty
Grudzień 7th, 2009 - 20:04
Kurcze, umknęło mi to. Już poprawiłem. Dzięki za zwrócenie uwagi
Grudzień 7th, 2009 - 20:23
co do chmod:
po pierwsze druga cyfra nie oznacza administratora, ale właściciela pliku – a to jest duża różnica!
po drugie: “0 (zero) na początku wartości chmod jest wymagane” – nie, nie jest wymagane – to funkcja wymaga, aby wartość jej argumentu była podana w ósemkowym systemie liczbowym (mała, acz istotna różnica)
Grudzień 7th, 2009 - 20:45
Poprawione, zapamiętane
Grudzień 7th, 2009 - 21:43
co do unlinka, to można powiedzieć ze jak się go użyje z odpowiednimi wrapperami to można usuwać pliki za pomocą URL’a taka fajna własność.
a co do chmoda to należy uważać na safe mode który sprawdza czy pliki maja takie same UID jak skrypt który wywołuje zmianę praw i bity lepkości (sticky bits) które definiują przez kogo może być zmieniany/usuwany plik.
Grudzień 7th, 2009 - 21:59
Pozwoliłem sobie zacytować sobie Twój komentarz we wpisie. Swoją drogą, to aż tak tego nie drążyłem.
Grudzień 8th, 2009 - 09:11
Nadal nie mogę pojąć sensu powstawania tego typu wpisów. Przecież równie dobrze można odwiedzić manual, znaleść dokładny opis tych funkcji jak i przykłady ich użycia.
Grudzień 8th, 2009 - 09:59
Rzecz w tym, że dużo początkujących nie korzysta z manuala i to do nich głównie kierowany jest ten wpis. Zwykle szukają odpowiedzi przez Google lub znane witryny tematyczne (w tym wypadku planeta.php.pl) i nie znając dokładnej nazwy funkcji starają się znaleźć to, czego potrzebują na podstawie opisu.
Grudzień 8th, 2009 - 15:16
A tak swoją drogą Sebastian, to co się stało z Twoim starym blogiem? Może jaką notkę odnośnie tego strzelisz?
Grudzień 8th, 2009 - 15:45
W poprzednim blogu szlag trafił bazę danych niestety. Wiadomo – darmowy hosting, to i wymagać nie można zbyt wiele. Poza tym ludzie dzielą się na tych co robią backupy i na tych, którzy będą je robić. Ja dopiero po upadku bazy przeszedłem z jednej do drugiej grupy (wiadomo której).
Jak trochę rozbuduję teraz bloga, to wykupie jakiś serwer.
Notki nie ma sensu wstawiać, bo co ja w niej napiszę? “Ojejejejej szlag trafił poprzednią bazę nie ma jak jej odzyskać i muszę zacząć od nowa.”?
Grudzień 8th, 2009 - 18:04
Oooo dobry pomysł
Grudzień 8th, 2009 - 18:11
Tak, a wykres odwiedzin bloga będzie po tym wyglądał jak wykres ruchu jednostajnie opóźnionego
Grudzień 8th, 2009 - 21:57
“Powyższy skrypt najpierw ustawia wszystkie prawa dla *administratora* oraz (…) dostęp do pliku dla *administratora* zostaje ograniczony (…)”
– zaś źle: dla właściciela pliku, nie administratora
Grudzień 8th, 2009 - 22:00
No tak. W jednym miejscu poprawiłem, w drugim już nie. Dzięki. Poprawione.