Profusion Codebase
  • Начало
  • Контакт
  • Връзки
  • Хостинг
  • Форум
  • Search
Въведение
  • Основи на PHP
  • Променливи и оператори
  • Контролни структури
  • Масиви
  • Функции
  • Класове
  • Работа с файлове
Инсталации
  • Apache/PHP/MySQL под Windows
  • phpMyAdmin под Windows
Работа с файлове

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

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

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

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

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

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+ (файлът се птваря за четене и запис. Ако в него е имало някакви данни, те ще бъдат загубени. Ако файлът не съществува, се създава нов файл), a (файлът се отваря за добавяне на данни към към съществуващите в него. Ако файлът не съществува се създава нов файл), a+ (файлът се отваря за четене и за добавяне на данни. Ако файлът съдържа данни, новите данни ще се запишат в края му. Ако файлът не съществува, се създава нов файл).
Третият аргумент include_pat (път) не е задължителен и се използва ако искате да търсите файла в пътя, зададен от този аргумент. Следващият код демонстрира използването на функцията fopen().

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(). Функциите filesize(), fgetc(), fgets(), feof() и fileseek() са едни от най често използваните функции.
Функцията filesize() връща размера на зададения файл. Ако зададения файл не съществува, се връща стойност False (или 0). Функцията има следния синтаксис:

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

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

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

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

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

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

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

Разгледайте следния код, който демонстрира използването на функциите filesize(), feof(), fgetc() и fgets().

$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";

Операцията по четене се прекратява при едно от следващите условия - прочетени са дължината (1 байта), достигнат е символа за нов ред ("\n"), достигнат е края на файла.
Можете да използвате функцията fseek(), за да зададете текущата позиция във файл. Синтаксисът на функцията е следният:

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

В горният синтаксис първият аргумент е файлов манипулатор, който задава файла върху който ще се изпълни функцията. Следващият аргумент отместване, е цяло число, което задава новата текуща позиция във файла. Третия аргумент база, задава как да се извърши изчислението на новата позиция. Стойностите на двата аргумента отместване и база представляват брой байтове. Аргументът база има следните три стандартни стойности - SEEK_SET, текущата позиция се премества от началото на файла на зададения брой байтове от параметъра отместване; SEEK_CUR, текущата позиция се изчислява, като към текущата позиция във файла се добавят броят байтове, зададени в параметъра отместване; SEEK_END, текущата позиция се изчислява като сума от дължината на файла и броя байтове, зададени в параметъра отместване.
За да разберете по-добре как действа функцията fseek(), разгледайте следния пример.

$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 във
файла.", "\n";

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

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

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

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

profusionstudio.com © 2001-2007. Някои права запазени. XHTML, CSS, RSS