Studio
projektowe |
4.1. Podstawowe operacje na plikach
Podstawowymi funkcjami plikowymi są: fopen(); fread(); fputs(); fgets(); fwrite; fclose(); Funkcja fopen() otwiera wskazany plik i w razie sukcesu zwraca nam liczbę dodatnią, która jest wskaźnikiem otwartego pliku. Będziemy go używać zawsze ilekroć będziemy odczytywać, zapisywać bądź zamykać plik. $wskaznik_pliku = fopen ($nazwa_pliku, $tryb_otwarcia); Jak widać nasza funkcja
ma 2 atrybuty. Nazwa pliku to po prostu ścieżka dostępu do pliku a tryb
otwarcia to jeden z 6 dostępnych trybów: 'w' - Otwórz tylko do zapisu; ustawia wskaźnik pliku na początku pliku i obcina plik (zeruje) do 0 długości. Jeśli plik nie istnieje to próbuje go utworzyć. 'w+' - Otwórz do odczytu i zapisu; ustawia wskaźnik pliku na początku pliku i obcina plik (zeruje) do 0 długości. Jeśli plik nie istnieje to próbuje go utworzyć. 'a' - Otwórz tylko do zapisu; ustawia wskaźnik pliku na końcu pliku. Jeśli plik nie istnieje to próbuje go utworzyć. 'a+' - Otwórz do odczytu i zapisu; ustawia wskaźnik pliku na końcu pliku. Jeśli plik nie istnieje to próbuje go utworzyć. (1)
Jeśli zdefiniowany został wskaźnik pliku, wybraliśmy odpowiedni tryb otwarcia to teraz możemy odczytać z pliku to, co nas interesuje. Odczyt pliku realizujemy za pomocą funkcji fread(); lub fgets(); $text_pliku = fread ($wskaznik_pliku, $dlugosc); $text_pliku = fgets ($wskaźnik_pliku, $dlugosc); Obie funkcje są do siebie bardzo podobne w obu możemy ustalić dowolny fragment pliku, który chcemy odczytać. W tym miejscu należy powiedzieć o bardzo przydatnej funkcji, która oblicza nam długość pliku przez co możemy od razu odczytać zawartość całego pliku. Jest to funkcja filesize($nazwa_pliku); Jeśli będziemy chcieli ją zastosować to napiszemy: $text_pliku = fread ($wskaznik_pliku, filesize($nazwa_pliku)); W przypadku funkcji fgets() dopuszczalne jest nie podawanie parametru $dlugosc, jest on bowiem domyślnie ustalona na 1kB czyli 1024. Jeśli chcielibyśmy odczytywać plik fragmentami np. w pętli while to zachęcam do skorzystania właśnie z tej funkcji. Będzie ona wykonywana do momentu natrafienie na koniec linii lub koniec pliku. No dobrze. Umiemy już otworzyć plik i odczytać jego zawartość, przyszedł czas aby coś zapisać. Do zapisywania łańcucha znaków w pliku służy funkcja fwrite: $ile = fwrite ($wskaznik_pliku, $dowolny_tekst); Funkcja ta zwraca liczbę zapisanych bajtów, lub FALSE w przypadku błędu. Więc jeśli będziemy chcieli mieć pewność że nasz tekst został zapisany prawidłowo w pliku, sprawdzimy czy zmienna $ile ma wartość i ile wynosi. Jeśli zmienna $ile ma wartość zgodną z ilością zapisanych bajtów to nasz tekst został poprawnie zapisany. Prosty przykład: <?php
$nazwa_pliku
= 'test.txt';
if (!$wskaznik_pliku
= fopen($nazwa_pliku, 'a+')) {
exit;
exit; fclose($wskaznik_pliku); ?> Ten prosty skrypt php ilustruje w jaki sposób otwieramy i zapisujemy tekst do pliku. W razie jakichkolwiek problemów skrypt podpowie w którym Momocie napotkał na błąd. Jeżeli chcielibyśmy zaprojektować licznik do naszej strony to w takim wypadku nie wystarczy otworzyć pliku i zapisać w nim wartość. Przykładowo załóżmy że nasz plik licznika, w którym będziemy zbierać informacje o liczbie odwiedzających nazwiemy licznik.txt. Gdy pierwszy raz wchodzimy na stronę to jest zapisywana wartość 1. Moglibyśmy to zrobić podobnie jak w powyższym przykładzie. Jeśli chcielibyśmy liczyć następnych internautów to musielibyśmy dodać fragment kodu który odczytywałby zapisaną w pliku wartość a następnie zwiększałby o 1 i znowu zapisywał. Mogłoby to wyglądać tak: <?php $nazwa_pliku = 'licznik.txt'; if (!$wskaznik_pliku = fopen($nazwa_pliku, 'a+')) {
echo "Nie mogę otworzyć pliku ($nazwa_pliku)"; }
$tekst =
fread($wskaznik_pliku, filesize($nazwa_pliku));
if (fwrite($wskaznik_pliku,
$tekst) === FALSE) echo "zapisano: \"$tekst\" do pliku ($nazwa_pliku)"; fclose($wskaznik_pliku); ?>
Prześledźmy działanie takiego licznika:
Licznik nie działa jak trzeba, to na pewno! Ale co się stało? Otworzyliśmy plik, odczytaliśmy jego zawartość i dopisaliśmy na koniec pliku wartość pliku zwiększoną o 1. Czyli na początku nie było pliku czyli 0++, 1 zapisaliśmy do pliku. Następnym razem odczytaliśmy wartość 1 zwiększyliśmy ja o 1 czyli 2 dopisaliśmy na koniec pliku. Nasz licznik.txt ma w rzeczywistości wartość 12. Kolejny raz odczytujemy plik i zwiększamy jego wartość czyli 12 + 1 i kolejny raz dopisujemy wartość na koniec pliku czyli 13 i teraz licznik.txt wygląda tak: 1213 itd.. Jak widać nic nam z takiego licznika... Gdybyśmy zmienili atrybut tak aby nasz zapis zaczynał się od początku pliku czyli na ‘w+’ to nic nie odczytalibyśmy z naszego pliku bo takie otwarcie automatycznie kasuje jego zawartość. Jak zatem zaprojektować licznik który byłby funkcjonalny w 100%? Należy dwukrotnie otworzyć plik licznik.txt, najpierw do odczytu (odczytujemy wartość licznika), zamknąć plik a następnie ponownie otworzyć do zapisu. Zwiększyć wartość i zapisać. Prześledźmy przykład: <?php $nazwa_pliku = 'licznik.txt'; if (!$wskaznik_pliku = fopen($nazwa_pliku, 'a+')) { echo "Nie mogę otworzyć pliku ($nazwa_pliku)"; exit; }
$tekst =
fread($wskaznik_pliku, filesize($nazwa_pliku)); if (!$wskaznik_pliku = fopen($nazwa_pliku, 'w+')) {
echo "Nie mogę otworzyć pliku ($nazwa_pliku)";
}
if (fwrite($wskaznik_pliku,
$tekst) === FALSE) { exit; } echo "zapisano: \"$tekst\" do pliku ($nazwa_pliku)"; fclose($wskaznik_pliku); ?>
Wygląda na to że wszystko działa jak trzeba. Uwaga: Przed uruchomieniem skryptu należy skasować plik licznik.txt z pamięci lub ustawić inną ścieżkę dostępu do pliku np.: $nazwa_pliku = licznik2.txt
|