Обучение в PHP - част 9 (Работа с файлове)
Ако преди това сте работили с други езици за програмиране, като С или С++, може би си спомняте, че работата с файлове може да се раздели на следните етапи:

Отваряне на файл. Зададения файл се отваря. Ако файла не съществува той се създава.
Обработка на файла. След като файла е бил отворен, той е готов за обработка. Може да четете данните от файла, да записвате в него, като започнете отначало, или да добавите новите данни към вече съществуващите.
Затваряне на файл. След като сте свършили работата си с файлта, трябва да го затворите


PHP предлага множество функции за работа с файлове, които можете да използвате, за да запишете данни от Web страница във файл, да извлечете данните от файл в Web страница или просто да промените или да добавите данни от вашата Web страница във файл. Някой от най често използваните файлови операции са:

Проверка за съществуването на файл
Отваряне на файл
Четене от файл
Запис във файл


Нека да разгледаме тези операции подробно

Проверка за съществуването на файл

Преди да извърщите операция с даден файл, често ще ви се налага да проверите дали файлът съществува или не. За целта можете да използвате функцията file_exists(). Функцията file_exists() връща стойност True ако зададения файл съществува, или стойност False ако не съществува. Функцията file_exists() е със следния синтаксис:

bool file_exists(string име_на_файл);

Както се вижда от горния синтаксис, функцията file_exists() приема само един аргумент - име_на_файл, който задава името на файла, за чието съществуване се проверява.

Разгледайте следния код за да разберете как се използва функцията file_exists().

<?php

if (!(file_exists("data.dat")))
{
echo "Файлът съществува"
}
else
{
echo "Файлът не съществува"
}

?>


В горния код наличието на файла data.dat се проверява с реда if (!(file_exists("data.dat"))). Както си спомняте от предишните уроци, оператирът ! обръща резултатът върнат от извикването file_exists("data.dat").

Отваряне на файл

За да отворите файл в PHP трябва да използвате функцията fopen(). Тази функция може да отоври или файл или URL адрес. Оттук следва, че файлът може да бъде както локален, така и отдалечен. Функцията fopen() извиква поне два аргумента. Синтаксисът на функцията fopen() е следният:

int fopen(string име_на_файл, string режим, int път);

В горния синтаксис аргумента име_на_файл задава името на файла, който трябва да се отвори. Ако стойността на аргумента име_на_файл започва с http://, тогава означава, че файлът се намира на отдалечен Web сървар и за да се отвори файлът трябва да се останови HTTP 1.0 сесия със зададения сървър. Аналогично, ако аргументът име_на_файл започва с FTP:// , зададения файл трябва да се свали от FTP сърварслед пстановяването на FTP сесия със зададения сървър. Ако стойноста на аргумента име_на_файл започва с php://stdin, php://stdout или с php://stderr, се отваря съответния стандартен входно изходен-поток. Обаче, ако стойността на аргумента не започва с никой от тези префикси, се приема, че зададения файл е локален , и PHP го търси във файловата система на текущия компютър.

Вторият аргумент mode(режим) задава, дали файлът се отваря за четене , за запис или за добавяне. Аргументът режим, може да приема една от следните стойности:


r Файлът се отваря само за четене

r+ Файлът се отваря за четене и запис, текущата позиция е началото на файла

w Файлът се отваря само за запис. Ако в него е имало някакви данни, те ще бъдат загубени.
Ако файлът не съществува, се създава нов файл.

w+ Файлът се птваря за четене и запис. Ако в него е имало някакви данни, те ще бъдат загубени.
Ако файлът не съществува, се създава нов файл.

а Файлът се отваря за добавяне на данни към към съществуващите в него. Ако файлът не съществува
се създава нов файл.

а+ Файлът се отваря за четене и за добавяне на данни. Ако файлът съдържа данни, новите данни
ще се запишат в края му. Ако файлът не съществува, се създава нов файл.

Третият аргумент include_pat (път) не е задължителен и се използва ако искате да търсите файла в пътя, зададен от този аргумент.

Следващият код демонстрира използването на функцията fopen().
<?php

if (!(file_exists("data.dat")))
{
$fp = fopen("data.dat","w+");
}
else
{
// Ако файлът съществува, данните ще се добавят
$fp = fopen("data.dat","a");
}

?>


В горния код първо се прави проверка за съществуването на файла data.dat Ако файлът не съществува, се създава нов файл с име data.dat чрез режима w+. Това означава, че файлът е готов, както за четене, така и за запис. От друга страна, ако изразът if (file_exist("data.dat")) върне стойност True ( тоест ако файлът data,dat съществува), файлът се отваря за добавяне на данни към него.

Можете да използвате знака @ пред функцията fopen(), както и пред всяка друга системна функция в PHP - например, @fopen("data.dat"),"w+");. Използването на символа @ в началото на функцията ще ви помогне да избегнете стандартните предупреждения на компилатора. Обаче трябва да се погрижите за предоставянето на собствени ( при изпълнението на програмиста ) съобщения за грешки, в случай, че функцията не успее да свърши задачата си.

Затваряне на файл

За да затворите файл, трябва да използвате функцията fclose(). Ако функцията fclose() затвори файла успошно, тя връща стойност True. Ако се провали затварянето на файла, функцията връща стойност False.
Синтаксисът на функцията fclose() е:

bool fclose(int файлов_маниполатор);

Функцията fclose() изисква като аргумент файловият маниполатор на файла, който трябва да се затвори. За да се изпълни функцията успешно, стойността на файловият маниполатор трябва да е валиден и да съответства на файла, който преди това е отворен с функцията fopen().

Четене от файл

За да прочетете данни от външен файл трябва да използвате функцията fread().
Синтаксисът на функцията fread() е:

string fread(int файлов_маниполатор, int дължина);

Както можете да видите, функцията fread() приема два аргумента: файлов_маниполатор и дължина. Аргументът файлов_маниполатор задава мястото във файла, от където да се чете. Аргументът дължина задава броя на символите, които да се прочетат от това място. Операцията по четене продължава докато се прочетат толкова символи, колкото са зададени от аргумента дължина. Ако се достигне до края на файла преди да се прочетат необходимоя брой символи, ще се върне низ, съдържаш прочетените до момента символи.

Разгледайте следния файл:

$fo = @fopen("C:\PHP\Myfiles\data1.dat", r)
or die ("Липсва файла!");
//-- Прочитат се първите 124 символа от файла data1.dat
$fr = fread($fo, 124);


В горния код файла data1.dat се отваря за четене с помоща на функцията fread(). Изразът or die ("Липсва файла!"); се използва за отпечатване на съобщение, ако функцията fopen() не успее да отвори файла. Резултатът от функцията ( 1 или 0 ) се съхранява в променливата $fo. След това трази променлива се предава на функцията fread() като файлов маниполатор. Стойността 124, предадена на fread(), задава, че трябва да се прочетат първите 124 символа от файла data1.dat

PHP предоставя множество файлови функции освен функцията fread(). Функциите fgetc(), fgets() и feof() са едни от най често използваните функции.

Функцията filesie()

Функцията filesie() връща размера на зададения файл. Ако зададения файл не съществува, се връща стойност False ( или 0 ). Функцията има следния синтаксис:

int filesie(string име_на_файл);

Както се вижда от горния синтаксис, функцията filesie() приема един аргумент - името на файла, чиято дължина трябва да се определи.

Функцията feof()

МОжете да използвате функцията feof(), за да определите дали цялото съдържание на зададения файл е било обработено и дали текущата позиция е в края на файла. Функцията връща стойност True, ако файловият маниполатор в момента сочи в края на файла, и стойност False, ако не е достигнат края на файла.

Функцията feof() приема като аргумент маниполатор на файл, както е показано в следващия синтаксис

int feof(int файлов_маниполатор);

Функциите fgetc() и fgets()

Функцията fread() връща низ с определена дължина от текущата позиция във файла. Но как можете да прочетете един символ? Можете лесно да накарате функцията fread() да прочете един символ, като зададете желаната позиция и дължина 1. Но PHP ви предоставя по-лесен начин да направите това! За целта използвайте функцията fgetc(). Тази функция взема един символ от текущата позиция във файла. Синтаксисът на функцията fgetc() е:

string fgetc(int файлов_маниполатор);

Функцията fgets() връща ред (низ) от текущата позиция във файла. За разлика от функцията fread(), дължината на низа върнат от функцията fgets(), е с единица по-малко от зададената като аргумент. Синтаксисът на функцията fgets() е:

string fgets(int файлов_маниполатор int дължина);

Операцията по четене се прекратява при едно от следващите условия:

Прочетени са дължината -1 байта
Достигнат е символа за нов ред - \n
Достигнат е края на файла


Разгледайте следния код, който демонстрира използването на функциите:

<?php

$file = "data1.dat";
// Отваряне на файла data1.dat

$fo = @fopen($file, "r")
or die ("Не може да се намери файла!");

// Намиране размера на файла - data1.dat
$file_length = filesize($file);
echo "Дължината на файла е : $file_length", "\n";

// Прочитане на файла ред по ред. При всяко срещане на края на ред,
// променливата $total_rows се увеличава с 1
while (!(feof($fo)))
{
$tr = fgets($fo, $file_length);
$total_rows = $total_rows + 1;
}
echo "Броят на редовете във файла е: $total_rows ", "\n";

// Затваряне на файла data1.dat за да може да се извърщи следващия цикъл
fcolse($fo);

// Повторно отваряне на файла data1.dat и текущата позиция е в началото на файла.
$fo1 = @fopen($file, "r");

// Прочитане на файла символ по символ. При всяко срещане на символ,
// променливата $total_rows се увеличава с 1
while (!(feof($fo)))
{
$tr = fgetc($fo1);
$total_rows = $total_rows + 1;
}
echo "Броят на символите във файла е: $total_rows ", "\n";

?>


Функцията fseek()

Можете да използвате функцията fseek(), за да зададете текущата позиция във файл. Синтаксисът на функцията е следният:

int fseek(int файлов_маниполатор, int отместване, int база);

В горният синтаксис първият аргумент е файлов маниполатор, който задава файла върху който ще се изпълни функцията. Следващият аргумент отместване, е цяло число, което задава новата текуща позиция във файла. Третия аргумент база, задава как да се извърши изчислението на новата позиция. Стойностите на двата аргумента оместване и база представляват брой байтове.
Аргументът база има следните три стандартни стойности:

SEEK_SET Текущата позиция се премества от началото на файла на зададения брой байтове от параметъра отместване.
SEEK_CUR Текущата позиция се изчислява, като към текущата позиция във файла се добавят броят байтове, зададени в параметъра отместване.
SEEK_END Текущата позиция се изчислява като сума от дължината на файла и броя байтове, зададени в параметъра отместване.


За да разберете по-добре как действа функцията fseek(), разгледайте следния пример:

<?php

$file = "data1.dat";

// Отваряне на файла data1.dat
$fo = $fopen($file, "r")
or die ("Не може да се намери файла");

// Определяне на дължината на data1.dat
$file_length = filesize($file);

echo "\n";
echo "Рамерът на файла: $file_length.", "\n";

// Позициониране на 22 байт във файла
$fs = fseek($fo, 22, SEEK_CUR);

// Прочитане на 6 символа от текущата позиция във файла
$current_char = fread($fo, 6);

echo "В момента текущата позиция е върху символа $current_char";

?>


Запис във файл

PHP предоставя функцията fwrite() за запис на данни във външен файл. Тази функция приема три аргумента. Синтаксисът на функцията ж е следния:

int fwrite(int файлов_маниполатор string низ, int дължина);

Първият аргумент е файлов маниполатор, в който искате да запишете данните. Вторият аргумент string (низ), е информацията, която искате да запишете. Последният аргумент, дължина, не е задължителен. Той задава броят байтове, които да се запишат във файла.

За да разберете по-добре действието на функцията fwrite(), разгледайте следния програмен фрагмент:

dataformat = "A20A50A200A4A2A10A6";
$line =
pack ($dataformat, $name, $addres, $email, $gander, $birth_mounth,
$comedy, $hobies[0]);
echo $line,"<br>",strlen($line);
$fp = @fopen("data.dat","w+")
or die ("Не може да се отвори файла");

// Запис във файла
$result = @fwrite($fp, $line)
or die ("Не може да се запишат данните във файла");

fclose($fp);


В горния код файлът data.dat се отваря в режим w+, което позволява операции за четене и запис във файла. След като файлът е отворен успешно, низът, съхранен в променливата $line, се записва във файла. Накрая, отворения файл се се затваря със помоща на функцията fclose().

Форматиране на данните

Да разгледаме следния ред:

dataformat = "A20A50A200A4A1A10A6";

Горния ред позволява съхраняването на информацията въведена в HTML формата, в променливата $dataformat в определен формат. Променливата $dataformat съхранява данните в едноредова структора, в която всяко поле има фиксирана дължина, запазена за него. Символът А предшества числата (20, 200, 50, 6, 10, 2, 4, 1), представлява променливите, като например $наме, #аддрес, $емаил в реда, който са получили от формата. Така:

[list]A20 Дефинира по едно поле от 20 символа, за стойността $name
А200 Дефинира поле от 200 символа, за стойността $email
А4 Дефинира поле от 4 символа, за стойността $ganger
А50 Дефинира поле от 50 символа, за стойността $addres
А6 Дефинира поле от 6 символа, за стойността $hobies[0]
А10 Дефинира поле от 10 символа, за стойността $comedy
А2 Дефинира поле от 2 символа, за стойността $birth_mounth [/list]

/ Трябва да сте регистриран за да напишете коментар /