Kursy

Operacje na plikach PHP

Operacje na plikach

W PHP, tak jak w każdym porządnym języku programowania, mamy dostęp do funkcji operujących na plikach. Mam nadzieję, że rozumiesz potrzebę używania przez skrypty plików. Jeżeli nie to podam przykład:
Potrzebna ci aplikacja, która będzie miała zmienną konfigurację, ustalaną przez użytkownika. Oczywiście, mógłbyś sobie olać konsumenta i zmusić go do samodzielnej zmiany danych w pliku (bo gdzieś informacje trzymać trzeba), ale to mijałoby się z ideą dynamicznego programowania stron. Dlatego sam musisz napisać skrypt zmieniający zawartość takiego pliku.

Podstawową funkcją służącą do obługi plików jest fopen(), która otwiera połączenie z plikiem. Zwraca ona FALSE, jeżeli nie można otworzyć pliku bądź liczbę całkowitą, jeżeli otwarcie się powiedzie. Oto schemat tej funkcji:

int fopen(String $nazwa_pliku, String $tryb [, int $uzyj_include_path]);

Pierwszym z argumentów jest nazwa pliku. Jeżeli na początku tej nazwy znajduje się łańcuch "http://", to otwierane jest połączenie HTTP, a funkcja zwraca odwołanie do samego ciała otrzymanej strony, tzn. bez dostępu do nagłówków. Oczywiście otrzymana strona dostępna jest tylko do odczytu.

Jeżeli na początku nazwy znajduje się łańcuch "ftp://" to wywoływane jest połączenie FTP. W tym trybie możliwe jest zapisywanie albo odczytywanie, jednak te czynności nie mogą być wykonywane razem, tj. żeby móc zapisać do pliku jakąś wartość trzeba otworzyć połączenie, a żeby potem coś z niego odczytać trzeba otworzyć kolejne połączenie.

Jeżeli nazwa pliku nie zawiera żadnego z powyższych początków to otwierany jest plik z lokalnego dysku. Ścieżka do pliku może być względna lub bezwzględna. Względna to taka, która zawiera adres pliku poczynając od danego katalogu, w którym znajduje się skrypt (np. "plik.txt"), natomiast bezwględna to taka, która zawiera adres pliku poczynając od katalogu głównego (np. Windowsowy - "c:\katalog\plik.txt" ['\' bo to znak specjalny], lub UNIXowy - "/home/user/plik.txt").

Drugim argumentem funkcji jest tryb otwarcia pliku, czyli informacja o tym co mamy zamiar z tym plikiem robić. Oto rodzaje trybów:

r tryb odczytu, otwierany jest wcześniej utworzony plik
r+ tryb odczytu z możliwością zapisu, otwierany jest wcześniej utworzony plik
w tryb zapisu, otwierany jest nowy, pusty plik
w+ tryb zapisu z możliwością odczytu, otwierany jest nowy, pusty plik
a tryb zapisu, jeżeli plik nie istnieje to jest on tworzony, w przeciwnym wypadku otwiera plik, a wskaźnik odczytu ustawiony jest na jego końcu
a+ tryb zapisu z możliwością odczytu, podobne właściwości co a

Dodatkowo w systemie Windows możliwe jest dodanie po literze oznaczającej tryb znak 'b', który informuje interpreter, że dany plik jest binarny. UNIX pomija powyższe oznaczenie.

Ostatnim argumentem jest $uzyj_include_path. Jest on rzadko używany. Informuje interpreter, że pliku ma szukać w katalogach ustalonych wcześniej w pliku konfiguracyjnym. Ma wtedy wartość 1. W przeciwnym wypadku się go pomija.

Należy pamiętać, że w systemach UNIX i jemu pokrewnych istnieją ograniczenia dostępu, które należy zmienić odpowiednio tak, aby możliwy był zapis bądź odczyt, inaczej wywołanie pliku skończy się błędem.

Drugą funkcją zajmującą się plikami jest fclose(). Zamyka ona połączenie z plikiem. Argumentem tej funkcji jest wskaźnik do pliku, uzyskany z funkcji fopen().

Następna funkcja, fgetc(), umożliwia pobranie z pliku jednego znaku. Jeżeli natrafi na koniec pliku, zwraca wartość FALSE, w przeciwnym wypadku ten jeden znak. Argumentem tej funkcji jest wskaźnik do pliku.

fgets(), której argumentem jest wskaźnik do pliku oraz maksymalna długość linii, pozwala na pobranie całej linii z pliku. Zwraca wartość FALSE jeżeli natrafi na koniec pliku, w przeciwnym wypadku zwraca linię. Wykorzystanie tych dwóch funkcji powoduje przesunięcie się wewnętrznego wskaźnika karetki, w pierwszym wypadku o jeden znak, w drugim o długość całej linii (razem ze znakami n i r).

Kolejną funkcją zbierającą dane z pliku jest fread(). Jej argumentami są wskaźnik do pliku i ilość znaków. Pobiera ona z pliku daną ilość znaków, oczywiście poczynając od aktualnego miejsca karetki.

Funkcje zbierające już poznałeś, czas więc na zapisujące! Pierwszą funkcją zapisującą jest fwrite(). Jej argumentami są wskaźnik pliku oraz łańcuch znaków, które mają się znaleźć w pliku. Funkcja ta zapisuje dany łańcuch do pliku zaczynając od aktualnego położenia karetki.

Następną funkcją zapisującą jest fputs(). Posiada takie same argumenty jak fwrite(), a różni się tylko tym, że na końcu łańcucha dopisuje znak końca linii, dzięki czemu następny zapis zostanie wywołany w nowej linii.

W PHP istnieje także funkcja, która ustawia karetkę w odpowiednim miejscu. Jest nią fseek(), a jej argumentami są wskaźnik do pliku oraz liczba, oznaczająca, ile znaków od początku ma znajdować się karetka.

Funkcja feof() sprawdza czy karetka nie znajduje się na końcu pliku. Jeżeli tak zwraca wartość TRUE, w przeciwnym wypadku FALSE. Jej argumentem jest wskaźnik do pliku.

Kolejną funkcją obsługującą pliki jest file_exists(). Jej argumentem jest adres pliku. Sprawdza, czy plik o podanej nazwie istnieje. Jeżeli tak zwraca wartość TRUE, w innym wypadku FALSE. Warto zawsze przed wywołaniem funkcji fopen() sprawdzić czy dany plik instnieje.

A teraz na zakończenie rozdziału krótki przykład pokazujący jak cały odczytać plik:

<?PHP
if (file_exists("przyklad.txt")) {
$p = fopen("przyklad.txt","r");
echo 'Zawartość pliku:<br>';
while (!feof($p)) {
$linia = fgets($p,1000);
echo $linia."<br>";
}
} else echo 'Brak pliku!';
?>

Istnieje alternatywne rozwiązanie problemu, który rozwiązywał powyższy przykład. Można to zrobić krócej za pomocą funkcji file(). Oto przykład:

 

<?PHP
if (file_exists("przyklad.txt")) {
echo 'Zawartość pliku:<br>';
$msg = implode(file("przyklad.txt"),"<br>n");
echo $msg;
} else echo 'Brak pliku!';
?>