Відмінності між версіями «Робота з файлами в PHP»
(→Зворотні апострофи) |
|||
Рядок 418: | Рядок 418: | ||
У параметрі ''маніпулятор'' передається маніпулятор, отриманий раніше при успішному виклик рореn ().<br/> | У параметрі ''маніпулятор'' передається маніпулятор, отриманий раніше при успішному виклик рореn ().<br/> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== '''Зворотні апострофи''' == | == '''Зворотні апострофи''' == | ||
Рядок 556: | Рядок 445: | ||
Функція escapeshellcmd () екранує символ *, запобігаючи катастрофічні наслідки виконання команди. <br/><br/><br/> | Функція escapeshellcmd () екранує символ *, запобігаючи катастрофічні наслідки виконання команди. <br/><br/><br/> | ||
+ | [[Інтернет-програмування]] | ||
+ | [[category:Інтернет-програмування|*]] | ||
− | + | [[category:Навчальні проекти]] | |
− | + | ||
− | + | ||
− | + | ||
Рядок 575: | Рядок 463: | ||
[[Як відредагувати певну рядок у файлі?]]<br> | [[Як відредагувати певну рядок у файлі?]]<br> | ||
[[Як "обнулити" (очистити) вміст файлу?]]<br> | [[Як "обнулити" (очистити) вміст файлу?]]<br> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
Версія за 11:44, 28 квітня 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 перераховані деякі значення, що визначають режим відкриття файлу.
Режим | Опис |
---|---|
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. "<br>"; 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> <h1> Alien lifeform discovered </h1> <br> <b> August 20. 2000 </b> <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> </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 = "<br>"; 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, відформатованих схожим чином.
Читання файлу в масив
Функція file () завантажує весь вміст файлу в індексованих масив. Кожен елемент масиву відповідає одному рядку файлу. Синтаксис функції filе ():
array file (string файл [, int включення_шляху])
Якщо необов'язковий третій параметр включення_шляху дорівнює 1, то шлях до файлу визначається по відношенню до каталогу включення файл, вказаною у файлі php.ini. У лістингу 5 функція file () використовується для завантаження файлу pastry.txt (див. лістинг 1).
Лістинг 5. Завантаження файлу pastry.txt функцією file ()
<? $ File_array = file ("pastry.txt"); while (list ($ line_num. $ line) = eacht ($ file_array)): print "<b> Line $ line_num: </ b>", htmlspecialchars ($ line), "<br> \ n" endwhile; ?>
Кожен рядок масиву виводиться разом з номером:
Line 0: Recipe: Pastry Dough Line 1: 1 1 / 4 cups all-purpose flour Line 2: 3 / 4 stick (6 tablespoons) unsalted butter, chopped Line 3: 2 tablespoons vegetable shortening Line 4: 1 / 4 teaspoon salt Line 5: 3 tablespoons water
Перенаправлення файлу в стандартний вихідний потік
Функція readfile () читає вміст файлу і направляє його в стандартний вивід (у більшості випадків - в браузер). Синтаксис функції readfile ():
int readfile (string файл [, int включення_шляху])
Функція повертає кількість прочитаних байтів. Файл може знаходитися в локальній файловій системі, існувати у вигляді стандартного потоку вводу / виводу або представляти файл у віддаленій системі, що приймається засобами HTTP або FTP. Параметр файл задається за тими ж правилами, що і у функції fopen ().
Припустимо, у вас є файл latorre.txt, вміст якого ви хочете вивести в браузері:
Restaurant "La Тоrrе." located in Nettuno, Italy, offers an eclectic blend of style. history, and fine seafood cuisine.
Within the walls of the medieval borgo surrounding the city, one can dine while watching the passersby shop in the
village boutiques. Comfort coupled with only the freshest seafare make La Torre one of Italy's finest restaurants.
При виконанні наступного фрагмента весь вміст latorre.txt направляється в стандартний вихідний потік:
<? $ Restaurant_file = "latorre.txt"; // Направити весь файл у стандартний вихідний потік readfile ($ restaurant_filе); ?>
Відкриття файлового маніпулятора процесу
popen ()
Поряд зі звичайними файлами можна відкривати файлові маніпулятори для взаємодії з процесами на сервері. Завдання вирішується функцією рореn (), яка має наступний синтаксис:
int popen (string команда, string режим)
Параметр команда визначає виконувану системну команду, а параметр режим описує режим доступу:
<? // Відкрити файл "spices.txt" для запису $ Fh = fopen ("spices.txt", "w"); // Додати кілька рядків тексту fputs ($ fh, "Parsley, sage, rosemary \ n"); fputs ($ fh, "Paprika, salt, pepper \ n"); fputs ($ fh, "Basil, sage, ginger \ n"); // Закрити маніпулятор fclose ($ fh); / / Відкрити процес UNIX grep для пошуку слова Basil у файлі spices.txt $ Fh - popen ("grep Basil <spices.txt", "r"); // Вивести результат роботи grep fpassthru ($ fh); ?>
Результат виглядає так:
Basil, sage, ginger
Функція fpassthru () є аналогом функції passthru (), що розглядається у розділі «Запуск зовнішніх програм.
pclose ()
Після виконання всіх операцій файл або процес необхідно закрити. Функція pclose () закриває з'єднання з процесом, заданим маніпулятором, за аналогією з тим, як функція fclose () закриває файл, відкритий функцією fopen (). Синтаксис функції pclose ():
int pclose (int маніпулятор)
У параметрі маніпулятор передається маніпулятор, отриманий раніше при успішному виклик рореn ().
Зворотні апострофи
Існує й інший спосіб виконання системних команд, що не вимагає виконання функцій, - виконувана команда полягає в зворотні апострофи (``), а результати її роботи відображаються в браузері. Приклад:
$ Output = `ls`; print "<pre> $ output </ pre>";
Цей фрагмент виводить в браузер вміст каталогу, в якому знаходиться сценарій.
Внутрішній параметр ping -c 5 (-n 5 в системі Windows) задає кількість опитувань сервера.
Якщо ви хочете просто повернути неформатований результати виконання команди, скористайтеся функцією passthru (), описаної нижче.
passthru ()
Функція passthru () працює майже так само, як ехес (), за одним винятком - вона автоматично виводить результати виконання команди. Синтаксис функції passthru ():
void passthru (string команда [, int повернення])
Якщо при виклику passthru () передається необов'язковий параметр повернення, цієї змінної присвоюється код повернення виконаної команди.
escapeshellcmd ()
Функція escapeshellcmd () екранує всі потенційно небезпечні символи, які можуть бути введені користувачем (наприклад, на формі HTML), для виконання команд exec (), passthru (), system () або рореn (). Синтаксис:
string escapeshellcmd (string команда)
До користувальницької введення завжди слід ставитися з певною часткою обережності, але навіть у цьому випадку користувачі можуть вводити команди, які будуть виконуватися функціями запуску системних команд. Розглянемо наступний фрагмент:
$ User_input = `rm-rf *`; // Видалити батьківський каталог і всі його підкаталоги ехес ($ user_input); / / Виконати $ user_input!
Якщо не вжити жодних запобіжних заходів, така команда призведе до катастрофи. Втім, можна скористатися функцій escapeshellcmd () для екранування користувальницької введення:
$ User_input = `rm - rf *`; // Видалити батьківський каталог і всі його підкаталоги ехес (escapeshellcmd ($ user_input)); // екранувати небезпечні символи
Функція escapeshellcmd () екранує символ *, запобігаючи катастрофічні наслідки виконання команди.
Інтернет-програмуванняЯк створити новий файл і записати в нього щось?
Як прочитати вміст текстового файлу цілком?
Як прочитати вміст текстового файлу порядково?
Як додати інформацію в початок файлу?
Як видалити рядок з файлу?
Як надіслати файл користувачеві?
Як отримати масив файлів у каталозі з певним розширенням?
Як вивести випадкову рядок з файлу?
Як записати файл у певному кодуванні?
Як відредагувати певну рядок у файлі?
Як "обнулити" (очистити) вміст файлу?