Відмінності між версіями «Робота з файлами в PHP»

Матеріал з Вікі ЦДУ
Перейти до: навігація, пошук
Рядок 143: Рядок 143:
  
  
 +
 +
== '''Читання з файлу''' ==<br/>
 +
Безсумнівно, читання є найголовнішою операцією, яка виконується з файлами. Нижче описані деякі функції, що підвищують ефективність читання з файлу. Синтаксис цих функцій практично точно копіює синтаксис аналогічних функцій запису.<br/>
 +
'''is_readable ()'''<br/>
 +
Функція i s_readable () дозволяє переконатися в тому, що файл існує і для нього дозволена операція читання. Можливість читання перевіряється як для файлу, так і для каталогу. Синтаксис функції is_readable ():<br/>
 +
''bool is_readable (string файл]''<br/>
 +
Швидше за все, PHP буде працювати під ідентифікатором користувача, використовуваним web-сервером (як правило, «nobody»), тому для того щоб функція is_readable () повертала TRUE, читання з файлу повинна бути дозволено всім бажаючим. Наступний приклад показує, як переконатися в те, що файл існує і доступний для читання:<br/>
 +
''if (is_readable ($ filename)):''<br/>
 +
''/ / Відкрити файл і встановити покажчик поточної позиції у кінець файлу''<br/>
 +
''$ Fh = fopen ($ filename, "r");''<br/>
 +
''else:''<br/>
 +
''print "$ filename is not readable!";''<br/>
 +
''endif;''<br/>
 +
<br/>
 +
'''fread ()'''<br/>
 +
Функція fread () читає з файлу, заданого файловим маніпулятором, задану кількість байт. Синтаксис функції fwrite ():<br/>
 +
int fread (int маніпулятор, int довжина)<br/>
 +
Маніпулятор має посилатися на відкритий файл, доступний для читання (див. опис функції is_readable ()). Читання припиняється після прочитання заданої кількості байт або при досягненні кінця файлу. Розглянемо текстовий файл pastry.txt, наведений у лістингу 1. Читання і вивід цього файлу в браузері здійснюється наступним фрагментом:<br/>
 +
''$ Fh = fopen ('pastry.txt', "r") or die ("Can't open file!");''<br/>
 +
''$ File = fread ($ fh, filesize ($ fh));''<br/>
 +
''print $ file;''<br/>
 +
''fclose ($ fh);''<br/>
 +
Використовуючи функцію fіlesize () для визначення розміру pastry.txt в байтах, ви гарантуєте, що функція fread () прочитає весь вміст файлу.<br/>
 +
'''Лістинг 1. Текстовий файл pastry.txt'''<br/>
 +
''Recipe: Pastry Dough''<br/>
 +
''1 1 / 4 cups all-purpose flour''<br/>
 +
''3 / 4 stick (6 tablespoons) unsalted butter, chopped''<br/>
 +
''2 tablespoons vegetable shortening 1 / 4 teaspoon salt''<br/>
 +
''3 tablespoons water''<br/>
 +
<br/>
 +
'''fgetc ()'''<br/>
 +
Функція fgetc () повертає рядок, що містить один символ з файлу у поточній позиції вказівника, або FALSE при досягненні кінця файлу. Синтаксис функції fgetc ():<br/>
 +
''string fgetc (int маніпулятор)''<br/>
 +
Маніпулятор має посилатися на відкритий файл, доступний для читання (див. опис функції is_readable () раніше в цьому розділі). У наступному прикладі продемонстровані посимвольне читання і вивід файлу з використанням функції fgetc ():<br/>
 +
''$ Fh = fopen ("pastry.txt", "r"); while (! Feof ($ fh)):''<br/>
 +
''$ Char = fgetc ($ fh):''<br/>
 +
''print $ char; endwhile;''<br/>
 +
''fclose ($ fh);''<br/>
 +
<br/>
 +
'''fgets ()'''<br/>
 +
Функція fgets () повертає рядок, прочитану від поточної позиції вказівника у файлі, що визначається файловим маніпулятором. Файловий покажчик повинен посилатися на відкритий файл, доступний для читання (див. опис функції is_readable () раніше в цьому розділі). Синтаксис функції fgets ():<br/>
 +
''string fgets (int маніпулятор, int довжина)''<br/>
 +
Читання припиняється при виконанні однієї з наступних умов:<br/>
 +
• з файлу прочитано довжина - 1 байт;<br/>
 +
• з файлу прочитаний символ нового рядка (включається в рядок, що повертається);<br/>
 +
• з файлу прочитаний ознака кінця файлу (EOF).<br/>
 +
Якщо ви хочете організувати Прогресивне читання файлу, передайте в другому параметрі значення, що свідомо перевищує кількість байт в рядку. Приклад прогресивного читання і виведення файлу:<br/>
 +
''$ Fh = fopen ("pastry.txt", "r");<br/>
 +
''while (! feof ($ fh));''<br/>
 +
''$ Line = fgets ($ fh, 4096);''<br/>
 +
''print $ line. "<br>";''<br/>
 +
''endwhile;''<br/>
 +
''fclose ($ fh):''<br/>
 +
<br/>
 +
'''fgetss ()'''<br/>
 +
Функція fgetss () повністю аналогічна fgets () за одним винятком - вона намагається видаляти з прочитаного тексту всі теги HTML і PHP:<br/>
 +
string fgetss (Int маніпулятор, int довжина [, string розширення_тегуі])<br/>
 +
Перш ніж переходити до прикладів, ознайомтеся з вмістом лістингу 2 - цей файл використовується в лістингу 3 та 4.<br/>
 +
'''Лістинг 2. Файл science.html'''<br/>
 +
''<html>''<br/>
 +
''<head>''<br/>
 +
''<title> Breaking News - Science </ title>''<br/>
 +
''<body><br/>
 +
''<h1> Alien lifeform discovered </ h1> <br>''<br/>
 +
''<b> August 20. 2000 </ b> <br>''<br/>
 +
''Early this morning, a strange new form of fungus was found growing in the closet of WJ Gilmore's old apartment refrigerator. It is not known if powerful radiation emanating from the tenant's computer monitor aided in this evolution.''<br/>
 +
''</ Body>''<br/>
 +
''</ Html>''<br/>
 +
'''Лістинг З. Видалення тегів з файлу HTML перед відображенням у браузері'''<br/>
 +
''<?''<br/>
 +
''$ Fh = fopen ("science.html", "r");''<br/>
 +
''while (! feof ($ fh)):''<br/>
 +
''print fgetss ($ fh, 2048);''<br/>
 +
''endwhile;''<br/>
 +
''fclose ($ fh);''<br/>
 +
''?>''<br/>
 +
'''Результат''' наведено нижче. Як бачите, з файлу science.html були вилучені всі теги HTML, що призвело до втрати форматування:<br/>
 +
''Breaking News - Science Alien lifeform discovered August 20. 2000 Early this morning, a strange new form of fungus was found growing in the closet of WJ Gilmore's old apartment refrigerator. It is not known if powerful radiation emanating from the tenant's computer monitor aided in this evolution.''<br/>
 +
У деяких ситуаціях з файлу видаляються всі теги, крім деяких - наприклад, тегів розриву рядків <br>. Лістинг 4 показує, як це робиться.<br/>
 +
'''Лістинг 4. Вибіркове видалення тегів з файлу HTML'''<br/>
 +
''<?''<br/>
 +
''$ Fh = fopenC'science. Html "," r ");''<br/>
 +
''$ Allowable = "<br>";''<br/>
 +
''while (! feof ($ fh)):''<br/>
 +
''print fgetss ($ fh. 2048, $ allowable);''<br/>
 +
''endwhile;''<br/>
 +
''fclose ($ fh);''<br/>
 +
''?>''<br/>
 +
'''Результат:'''<br/>
 +
''Breaking News - Science Alien lifeform discovered August 20. 2000 Early this morning, a strange new form of fungus was found growing in the closet of WJ Gilmore's old apartment refrigerator. It is not known if powerful radiation emanating from the tenant's computer monitor aided in this evolution.''<br/>
 +
Як бачите, функція fgetss () спрощує перетворення файлів, особливо за наявності великої кількості файлів HTML, відформатованих схожим чином.<br/>
  
  

Версія за 07:21, 23 квітня 2010

Зміст

Перевірка існування та розміру файлу

Перш ніж намагатися працювати з файлом, бажано переконатися в тому, що він існує. Для вирішення цього завдання зазвичай використовуються дві функції:
file_exists () і is_file ().

file_exists ().
Функція filе_ехists () перевіряє, чи існує заданий файл. Якщо файл існує, функція повертає TRUE, в іншому випадку повертається FALSE. Синтаксис функції file_exists ():
bool file_exists (string файл)
Приклад перевірки існування файлу:
if (! file_exists ($ filename)):
print "File $ filename does not exist!";
endif:

is_file ()
Функція is_file () перевіряє існування заданого файлу і можливість виконання з ним операцій читання / запису. По суті, is_file () являє собою більш надійну версію file_exists (), яка перевіряє не тільки факт існування файлу, але і те, чи підтримує він читання і запис даних:
bool is_file (string файл)
Наступний приклад показує, як переконатися в існуванні файлу і можливості виконання операцій з ним:
$File = "somefile.txt";
if (is_file ($file)):
print "The file $ file is valid and exists!";
else:
print "The file $ file does not exist or it is not a valid file!";
endif:
Переконавшись у тому, що потрібний файл існує, і з ним можна виконувати різні операції читання / запису, можна переходити до наступного кроку - відкриття файлу.

filesize ()
Функція filesize () повертає розмір (в байтах) файлу з заданим ім'ям або FALSE в разі помилки. Синтаксис функції filesize ():
int filesize (string ім'я_файлу)
Припустимо, ви хочете визначити розмір файлу pastry.txt. Для отримання потрібної інформації можна скористатися функцією filesize ():
$Fs = filesize ("pastry.txt"); print "Pastry.txt is $Fs bytes.";
Виводиться наступний результат:
Pastry.txt is 179 bytes.
Перш ніж виконувати операції з файлом, необхідно відкрити його і пов'язати з файловим маніпулятором, а після завершення роботи з файлом його слід закрити.




Відкриття та закриття файлів

Перш ніж виконувати операції вводу / виводу з файлом, необхідно відкрити його функцією fopen ().
fopen ()
Функція fopen () відкриває файл (якщо він існує) і повертає ціле число - так званий файловий маніпулятор (file handle). Синтаксис функції fopen ():
int fopen (string файл, string режим [, int включення_шляху])
Відкриває файл може знаходитися в локальній файловій системі, існувати у вигляді стандартного потоку вводу / виводу або представляти файл у віддаленій системі, що приймається засобами HTTP або FTP.
Параметр файл може здаватися в декількох формах, перерахованих нижче:
• Якщо параметр містить ім'я локального файлу, функція fopen () відкриває цей файл і повертає маніпулятор.
• Якщо параметр заданий у вигляді php: / / stdin, php: / / stdout або php: / / stderr, відкривається відповідний стандартний потік вводу / виводу.
• Якщо параметр починається з префікса http://, функція відкриває підключення HTTP до сервера і повертає маніпулятор для зазначеного файлу.
• Якщо параметр починається з префікса ftp://, функція відкриває підключення FTP до сервера і повертає маніпулятор для зазначеного файлу. У цьому випадку слід звернути особливу увагу на дві обставини: якщо сервер не підтримує пасивний режим FTP, виклик fopen () завершується невдачею. Більш того, FTP-файли відкриваються або для читання, або для запису.
При роботі в пасивному режимі сервер &!!&!!&!!&&&!!&&&&&&&ЯР&&&&&!!&&&!!&!!&!!&& очікує підключення з боку клієнтів. При роботі в активному режимі сервер сам встановлює з'єднання з клієнтом. За замовчуванням звичайно використовується активний режим.
Параметр режим визначає можливість виконання читання і запису у файл. У табл. 1 перераховані деякі значення, що визначають режим відкриття файлу.


Таблиця 1. Режими відкриття файлу
Режим Опис
r Файл відкривається тільки для читання. Якщо файлу не існує, виклик реєструє помилку. Після успішного відкриття вказівник файлу встановлюється на його перший байт, тобто на початок.
r + Файл відкривається одночасно для читання та запису. Вказівник поточної позиції встановлюється в початок файлу, тобто на перший байт. Якщо файлу не існує повертається false. Якщо в момент запису вказівник файлу встановлено приміром в середину файлу, то дані запишуться прямо поверх існуючих, а не розсунуть їх, при необхідності збільшивши розмір файлу.
w Тільки запис. Покажчик поточної позиції встановлюється в початок файлу, а весь вміст файлу знищується. Якщо файл не існує, функція намагається створити його.
w + Читання і запис. Покажчик поточної позиції встановлюється в початок файлу, а весь вміст файлу знищується. Якщо файл не існує, функція намагається створити його.
a Відкриває існуючий файл тільки для запису. Покажчик поточної позиції встановлюється в кінець файлу. Якщо файл не існує, функція намагається створити його.
a + Відкриває файл для читання та запису. Покажчик поточної позиції встановлюється в кінець файлу, при цьому вміст файлу не знищується. Якщо файл не існує, функція створює його. Ця функція є корисною, якщо потрібно дописати в файл, але не відомо, чи існує файл.



Якщо необов'язковий третій параметр включення_шляху дорівнює 1, то шлях до файлу визначається по відношенню до каталогу включення файл, вказаною у файлі php.
Нижче наведено приклад відкриття файлу функцією fopen (). Виклик die (), який використовується у поєднанні з fopen (), забезпечує вивід повідомлення про помилку в тому випадку, якщо відкрити файл не вдасться:
$File = "userdata.txt"; / / Певний файл
$Fh = fopen ($ file, "a +") or die ("File ($file) does not exist!");
Наступний фрагмент відкриває підключення до сайту PHP (http://www.php.net):
$Site = "http://www.php.net": / / Сервер, доступний через HTTP
$Sh = fopen ($site., "R"); / / Зв'язати маніпулятор з індексного сторінкою Php.net
Після завершення роботи файл завжди слід закривати функцією fclose ().
fclose ()

Функція fclose () закриває файл із заданим маніпулятором. При успішному закриття повертається TRUE, при невдачі - FALSE. Синтаксис функції fclose ():
int fclose (int маніпулятор)
Функція fclose () успішно закриває лише ті файли, які були раніше відкриті функціями fopen () або fsockopen (). Приклад закриття файлу:
$File = "userdata.txt";
if (file_exists ($file)):
$Fh = fopen ($file, "r");
/ / Виконати операції з файлом
fclose ($fh);
else:
print "File Sfile does not exist!";
endif;



Запис у файл

З відкритими файлами виконуються дві основні операції - читання і запис.
is_writeable ()
Функція is_writeable () дозволяє переконатися в тому, що файл існує і для нього дозволена операція запису. Можливість запису перевіряється як для файлу, так і для каталогу. Синтаксис функції is_writeable ():
bool is_writeable (string файл)
Одна важлива обставина: швидше за все, PHP буде працювати під ідентифікатором користувача, використовуваним web-сервером (як правило, «nobody»). Приклад використання is_writeable () наведено в описі функції fwrite ().
fwrite ()
Функція fwrite () записує вміст строкової змінної в файл, заданий файловим маніпулятором. Синтаксис функції fwrite ():
int fwrite (int маніпулятор, string мінлива [, int довжина])
Якщо при виконанні функції передається необов'язковий параметр довжина, запис зупиняється або після запису вказаної кількості символів, або при досягненні кінця рядка. Перевірка можливості запису у файл продемонстрована в наступному прикладі:
<?
/ / Інформація про трафік на користувальницькому сайті
$ Data = "08:13:00 | 12:37:12 | 208.247.106.187 | Win98";
$ Filename = "somefile.txt";
/ / Якщо файл існує і в нього можливий запис
if (is_writeable ($ filename)):
/ / Відкрити файл і встановити покажчик поточної позиції у кінець файлу
$ Fh = fopen ($ filename, "a +");
/ / Записати вміст $ data в файл
$ Success - fwrite ($ fh, $ data);
/ / Закрити файл
fclose ($ fh); else:
print "Could not open Sfilename for writing";
endif;
?>
Функція fputs () є псевдонімом fwrite () і може використовуватися всюди, де використовується fwrite ().
fputs ()
Функція fputs () є псевдонімом fwrite () і має точно такий же синтаксис. Синтаксис функції fputs ():
int fputs (int маніпулятор, string мінлива [, int довжина])


== Читання з файлу ==
Безсумнівно, читання є найголовнішою операцією, яка виконується з файлами. Нижче описані деякі функції, що підвищують ефективність читання з файлу. Синтаксис цих функцій практично точно копіює синтаксис аналогічних функцій запису.
is_readable ()
Функція i s_readable () дозволяє переконатися в тому, що файл існує і для нього дозволена операція читання. Можливість читання перевіряється як для файлу, так і для каталогу. Синтаксис функції is_readable ():
bool is_readable (string файл]
Швидше за все, PHP буде працювати під ідентифікатором користувача, використовуваним web-сервером (як правило, «nobody»), тому для того щоб функція is_readable () повертала TRUE, читання з файлу повинна бути дозволено всім бажаючим. Наступний приклад показує, як переконатися в те, що файл існує і доступний для читання:
if (is_readable ($ filename)):
/ / Відкрити файл і встановити покажчик поточної позиції у кінець файлу
$ Fh = fopen ($ filename, "r");
else:
print "$ filename is not readable!";
endif;

fread ()
Функція fread () читає з файлу, заданого файловим маніпулятором, задану кількість байт. Синтаксис функції fwrite ():
int fread (int маніпулятор, int довжина)
Маніпулятор має посилатися на відкритий файл, доступний для читання (див. опис функції is_readable ()). Читання припиняється після прочитання заданої кількості байт або при досягненні кінця файлу. Розглянемо текстовий файл pastry.txt, наведений у лістингу 1. Читання і вивід цього файлу в браузері здійснюється наступним фрагментом:
$ Fh = fopen ('pastry.txt', "r") or die ("Can't open file!");
$ File = fread ($ fh, filesize ($ fh));
print $ file;
fclose ($ fh);
Використовуючи функцію fіlesize () для визначення розміру pastry.txt в байтах, ви гарантуєте, що функція fread () прочитає весь вміст файлу.
Лістинг 1. Текстовий файл pastry.txt
Recipe: Pastry Dough
1 1 / 4 cups all-purpose flour
3 / 4 stick (6 tablespoons) unsalted butter, chopped
2 tablespoons vegetable shortening 1 / 4 teaspoon salt
3 tablespoons water

fgetc ()
Функція fgetc () повертає рядок, що містить один символ з файлу у поточній позиції вказівника, або FALSE при досягненні кінця файлу. Синтаксис функції fgetc ():
string fgetc (int маніпулятор)
Маніпулятор має посилатися на відкритий файл, доступний для читання (див. опис функції is_readable () раніше в цьому розділі). У наступному прикладі продемонстровані посимвольне читання і вивід файлу з використанням функції fgetc ():
$ Fh = fopen ("pastry.txt", "r"); while (! Feof ($ fh)):
$ Char = fgetc ($ fh):
print $ char; endwhile;
fclose ($ fh);

fgets ()
Функція fgets () повертає рядок, прочитану від поточної позиції вказівника у файлі, що визначається файловим маніпулятором. Файловий покажчик повинен посилатися на відкритий файл, доступний для читання (див. опис функції is_readable () раніше в цьому розділі). Синтаксис функції fgets ():
string fgets (int маніпулятор, int довжина)
Читання припиняється при виконанні однієї з наступних умов:
• з файлу прочитано довжина - 1 байт;
• з файлу прочитаний символ нового рядка (включається в рядок, що повертається);
• з файлу прочитаний ознака кінця файлу (EOF).
Якщо ви хочете організувати Прогресивне читання файлу, передайте в другому параметрі значення, що свідомо перевищує кількість байт в рядку. Приклад прогресивного читання і виведення файлу:
$ Fh = fopen ("pastry.txt", "r");
while (! feof ($ fh));
$ Line = fgets ($ fh, 4096);
print $ line. "
";

endwhile;
fclose ($ fh):

fgetss ()
Функція fgetss () повністю аналогічна fgets () за одним винятком - вона намагається видаляти з прочитаного тексту всі теги HTML і PHP:
string fgetss (Int маніпулятор, int довжина [, string розширення_тегуі])
Перш ніж переходити до прикладів, ознайомтеся з вмістом лістингу 2 - цей файл використовується в лістингу 3 та 4.
Лістинг 2. Файл science.html
<html>
<head>
<title> Breaking News - Science </ title>
<body>

Alien lifeform discovered </ h1>

August 20. 2000 </ b>

Early this morning, a strange new form of fungus was found growing in the closet of WJ Gilmore's old apartment refrigerator. It is not known if powerful radiation emanating from the tenant's computer monitor aided in this evolution.
</ Body>
</ Html>
Лістинг З. Видалення тегів з файлу HTML перед відображенням у браузері
<?
$ Fh = fopen ("science.html", "r");
while (! feof ($ fh)):
print fgetss ($ fh, 2048);
endwhile;
fclose ($ fh);
?>
Результат наведено нижче. Як бачите, з файлу science.html були вилучені всі теги HTML, що призвело до втрати форматування:
Breaking News - Science Alien lifeform discovered August 20. 2000 Early this morning, a strange new form of fungus was found growing in the closet of WJ Gilmore's old apartment refrigerator. It is not known if powerful radiation emanating from the tenant's computer monitor aided in this evolution.
У деяких ситуаціях з файлу видаляються всі теги, крім деяких - наприклад, тегів розриву рядків
. Лістинг 4 показує, як це робиться.
Лістинг 4. Вибіркове видалення тегів з файлу HTML
<?
$ Fh = fopenC'science. Html "," r ");
$ Allowable = "
";

while (! feof ($ fh)):
print fgetss ($ fh. 2048, $ allowable);
endwhile;
fclose ($ fh);
?>
Результат:
Breaking News - Science Alien lifeform discovered August 20. 2000 Early this morning, a strange new form of fungus was found growing in the closet of WJ Gilmore's old apartment refrigerator. It is not known if powerful radiation emanating from the tenant's computer monitor aided in this evolution.
Як бачите, функція fgetss () спрощує перетворення файлів, особливо за наявності великої кількості файлів HTML, відформатованих схожим чином.
Як створити новий файл і записати в нього щось?
Як прочитати вміст текстового файлу цілком?
Як прочитати вміст текстового файлу порядково?
Як додати інформацію в початок файлу?
Як видалити рядок з файлу?
Як надіслати файл користувачеві?
Як отримати масив файлів у каталозі з певним розширенням?
Як вивести випадкову рядок з файлу?
Як записати файл у певному кодуванні?
Як відредагувати певну рядок у файлі?
Як "обнулити" (очистити) вміст файлу?
http://base.vingrad.ru/view/2843-Rabota-s-faylami-v-PHP-FAQ Как создать новый файл и записать в него что-то? Как прочитать содержимое текстового файла целиком? Как прочитать содержимое текстового файла построчно? Как добавить информацию в начало файла? Как удалить строчку из файла? Как послать файл пользователю? Как получить массив файлов в каталоге с определенным расширением? Как вывести случайную строку из файла? Как записать файл в определенной кодировке? Как отредактировать определенную строчку в файле? Как "обнулить" (очистить) содержимое файла?