Створення файлу

 

Функція fopen

Взагалі кажучи, в PHP не існує функції, призначеної саме для створення файлів. Більшість функцій працюють з вже існуючими файлами в файловій системі сервера. Є кілька функцій, які дозволяють створювати тимчасові файли, або, що те ж саме, файли з унікальним для поточної директорії імені. А от для того, щоб створити самий звичайний файл, потрібно скористатися функцією, яка відкриває локальний або віддалений файл. Називається ця функція fopen (). Що значить «відкриває файл»? Це означає, що fopen пов'язує цей файл з потоком управління програми. Причому зв'язування буває різним в залежності від того, що ми хочемо робити з цим файлом: читати його, записувати в нього дані або робити і те й інше. Синтаксис цієї функції такий:

resource fopen (ім'я_файлу, тип_доступу 
[, Use_include_path])

У результаті роботи ця функція повертає покажчик (типу ресурс) на відкритий нею файл. В якості параметрів цієї функції передаються: ім'я файлу, який потрібно відкрити, тип доступу до файлу (визначається тим, що ми збираємося робити з ним) і параметр, що визначає, чи шукати вказаний файл у include_path. Є ще один параметр, але про нього ми говорити не будемо, щоб не ускладнювати виклад. Обговоримо докладніше кожен з цих трьох параметрів.

Параметр ім'я_файлу повинен бути рядком, що містить правильне локальне ім'я файлу або URL-адресу файлу в мережі. Якщо ім'я файлу починається з вказівки протоколу доступу (наприклад, http:// ... або ftp:// ...), то інтерпретатор вважає це ім'я адресою URL і шукає обробник зазначеного в URL протоколу. Якщо обробник знайдений, то PHP перевіряє, чи дозволено працювати з об'єктами URL як зі звичайними файлами (директива allow_url_fopen). Якщо allow_url_fopen = off, то функція fopen викликає помилку і генерується попередження. Якщо ім'я файлу не починається з протоколу, то вважається, що зазначено ім'я локального файлу. Для відкриття локального файлу, потрібно, щоб PHP мав відповідні права доступу до цього файлу.

Параметр use_include_path, встановлений в значення 1 або TRUE, змушує інтерпретатор шукати зазначений в fopen () файл у include_path. Нагадаємо, що include_path - це директива з файлу налаштувань PHP, що задає список директорій, в яких можуть знаходитися файли для включення. Крім функції fopen () вона використовується функціями include () і require ().Параметр use_include_path, встановлений в значення 1 або TRUE, змушує інтерпретатор шукати зазначений у fopen () файл у include_path. Нагадаємо, що include_path - це директива з файлу налаштувань PHP, що задає список директорій, в яких можуть знаходитися файли для включення. Крім функції fopen () вона використовується функціями include () і require ().

Параметр тип_доступу може приймати одне з наступних значень:

 

Тип доступу

Опис

r

Відкриває файл тільки для читання; встановлює вказівник позиції у файлі на початок файлу.

r +

Відкриває файл для читання і запису; встановлює вказівник файлу на його початок.

w

Відкриває файл тільки для запису; встановлює вказівник файлу на його початок і обрізає файл до нульової довжини. Якщо файл не існує, то намагається створити його.

w +

Відкриває файл для читання і запису; встановлює вказівник файлу на його початок і обрізає файл до нульової довжини. Якщо файл не існує, то намагається створити його.

a

Відкриває файл тільки для запису; встановлює вказівник файлу в його кінець. Якщо файл не існує, то намагається створити його.

a +

Відкриває файл для читання і запису; встановлює вказівник файлу в його кінець. Якщо файл не існує, то намагається створити його.

x

Створює і відкриває файл тільки для запису; поміщає вказівник файлу на його початок. Якщо файл вже існує, то fopen () повертає false і генерується попередження. Якщо файл не існує, то робиться спроба створити його. Цей тип доступу підтримується починаючи з версії PHP 4.3.2 і працює тільки з локальними файлами.

x +

Створює і відкриває файл для читання і запису; поміщає вказівник файлу на його початок. Якщо файл вже існує, то fopen () повертає false і генерується попередження. Якщо файл не існує, то робиться спроба створити його. Цей тип доступу підтримується, починаючи з версії PHP 4.3.2, і працює тільки з локальними файлами.

Отже, щоб створити файл, потрібно, як би безглуздо це не звучало, відкрити неіснуючий файл на запис.

Приклад. Використання функції fopen ()

<? Php 
$h = fopen ("my_file.html", "w"); 
/* Відкриває на запис файл my_file.html, 
якщо він існує, або створює порожній 
файл з таким ім'ям, якщо його ще немає */ 
$h = fopen ("dir / another_file.txt", "w +"); 
/* Відкриває на запис і читання або створює 
файл another_file.txt в директорії dir */ 
$h = fopen ("Http://www.server.ru/dir/file.php", "r"); 
/* Відкриває на читання файл, що знаходиться за 
вказаною адресою */ 
?>

Створюючи файл, потрібно враховувати, під якою операційною системою ви працюєте, і під яку ОС імовірно цей файл буде використовуватись. Справа в тому, що різні операційні системи по-різному позначають кінець рядка. У Unix-подібних ОС кінець рядка позначається \ n, в системах типу Windows - \ r \ n. Windows пропонує спеціальний параметр t для перетворення символів кінця рядка систем типу Unix в свої символи кінця рядка. На противагу цьому існує опція b, використовується найчастіше для бінарних файлів, завдяки чому такої трансляції не відбувається. Використовувати ці прапори можна, просто дописавши їх після останнього символу обраного типу доступу до файлу. Наприклад, відкриваючи файл на читання, замість r слід використовувати rt, щоб перекодувати всі символи кінця рядка в \ r \ n. Якщо не використовувати прапор b при відкритті бінарних файлів, то можуть з'являтися помилки, пов'язані зі зміною вмісту файлу. З міркувань переносимості програми на різні платформи рекомендується завжди використовувати прапор b при відкритті файлів за допомогою fopen ().

Що відбувається, якщо відкрити або створити файл за допомогою fopen не вдається? У цьому випадку PHP генерує попередження, а функція fopen повертає як результат своєї роботи значення false. Такого роду попередження можна «придушити» (заборонити) за допомогою символу @.

Наприклад, така команда не виведе попередження, навіть якщо відкрити файл не вдалося:

$h = @ fopen ("dir / another_file.txt", "w +");

Таким чином, функція fopen () дозволяє створити тільки лише порожній файл і зробити його доступним для запису. Як же записати дані в цей файл? Як прочитати дані з вже існуючого файлу?

Перш ніж відповісти на ці запитання, розглянемо, як закрити встановлене з допомогою fopen () з'єднання.