PHP. Робота з файлами і каталогами

Бази даних MySQL і Access все частіше стають загальнодоступними засобами зберігання даних. Але на початку 1990-х була популярна робота з файлами в PHP, збереження записів у форматованих текстові файли у форматі CSV, розділених новими рядками.

Основні принципи роботи

Бази даних зручні, але кожен розробник повинен мати принаймні деякі базові знання про те, як читати і писати файли. Можливо, багато хто задумається над питанням: «Чому мені потрібно це знати? Якщо я використовую файли, вони написані в XML, і я просто застосовую синтаксичний аналізатор».

Отже, ось кілька причин, по яких можуть знадобитися файли:

  • Щоб перемістити двійкові дані (наприклад, файли зображень в базу даних BLOB (двійкові великі об’єкти).
  • Імпорт даних (наприклад, адреси електронної пошти), експортованих з застарілої бази даних або програми.
  • Щоб з бази даних експортувати інформацію в текстовий файл для обробки в автономному режимі.
  • Читання файлів і запис – це основні операції. Якщо потрібно прочитати документ, то спочатку його потрібно відкрити. Після цього слід прочитати якомога більше вмісту, потім закрити файл. Для запису інформації в документ, потрібно його спочатку відкрити (або, можливо, створити, якщо його ще не створено). Після цього записують необхідні дані і закривають його.

    Зручно використовувати і вбудовані функції, які автоматично роблять відкриття і закриття. Вони доступні в PHP5.Також слід ознайомитися з атрибутами файлів, тобто з його властивостями.

    Вони можуть розповісти:

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

    Найкраще вивчити всі основні атрибути для роботи з файлами в PHP. Це багато в чому полегшить роботу.

    Історія файлів

    Може знадобиться дізнатися час останнього редагування файлу. У цьому випадку на допомогу приходять функції: fileatime(), filemtime() і filectime().


    “;
    echo $file . “мав останнє редагування i-вузла” . date($formatDate, $timeM) . “.
    “;
    echo $file . “був змінений” . date($formatDate, $timeC) . “.”;

    Тут код отримує тимчасову мітку останнього доступу і відображає її:

    • C: Windowsfile.ini був переглянутий 19 вер 2018 4:34 вечора.
    • C: Windowsfile.ini був змінений Пт 8 окт 2018 2:03 ранку.
    • C: Windowsfil.ini був змінений в Нд 16 гру 2017 4:34.

    Функція filectime() показує час зміни різної інформації, пов’язаної з файлом (наприклад, права доступу), а filemtime() – зміни самого файлу.

    Функція date() використовувалася для форматування тимчасової мітки Unix, повертається file*time() функціями.

    Файл чи ні?

    Щоб дізнатися, чи дійсно відбувається робота з файлами в PHP, можна використовувати is_file() функцію або is_dir(), перевіряючі, каталог.

    “;
    echo $file . (is_dir($file) ? “” : “не”) . ” каталог.”;

    Висновок коду прикладу:

    • C: Windowsfile.ini файл.
    • C: Windowsfile.ini не каталог.

    Таким чином можна уникнути помилок і не відкрити з необережності «не файл». В PHP робота з файлами і каталогами аналогічна.

    Дозволу для файлів

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

    “;
    echo $file . (is_writable($file) ? “” : “не”) . ” записується.”;

    Ці функції повертають логічні значення і пояснюють, операція може бути виконана у файлі.

    Код виведе наступні значення на екран:

    • C: Windowsfile.ini читається.
    • C: Windowsfile.ini не записується.

    Використовуючи тернарний оператор, можна вказати, доступний файл чи ні.

    Розмір файлу

    Щоб дізнатися розмір файлу, потрібно використовувати функцію filesize(). Він буде показаний в байтах.

    Функція виведе на екран наступне:

    • C: Windowsfile.ini має розмір 510 байт.

    Використання файлу в системі Windows, тут підкреслює один нюанс. Зворотна коса риса має особливе значення як символ escape. Потрібно буде уникати цього, додавши ще одну зворотну косу риску.

    Якщо файл ще не створений, функція filesize() вкаже на False помилку. Тому спочатку перевіряють файл на існування потрібної команди file_exists().

    Цікаве:  Чому компютер не бачить телефон через USB, тільки заряджається: причини

    Перевірку file_exists() потрібно включати практично завжди для безпеки.

    Читання файлів

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

    Функції для роботи з файлами PHP полегшують завдання. В даному випадку знадобиться file_get_contents(). Вона буде зчитувати весь вміст файлу в змінну без необхідності відкривати або закривати файл самостійно. Це зручно, коли обсяг запису відносно невеликий, так як відразу зчитувати 1 ГБ даних в архів не завжди раціонально в PHP. Робота з «.ini»-файлами і функцією file_get_contents() показана нижче.

    Для великих файлів або просто в залежності від потреб вашого скрипта, може бути розумніше обробляти деталі самостійно. Це пов’язано з тим, що як тільки файл відкривається, ви можете шукати в ньому певне зауваження і читати стільки даних, скільки захочете. Функція fopen() використовується для відкриття файлу.

    Для роботи з функцією fopen() необхідні два аргументи:

    • файл, який потрібно відкрити;
    • режим, що використовується в цьому випадку є «r» для читання.

    Функція повертає дескриптор або потік в файл, який зберігається у змінній $file1. Її потрібно використовувати у всіх наступних командах при роботі з файлом.

    Найбільш поширені значення режиму

    Режим Значення Позиція курсору Якщо файлу не існує?
    r тільки читання початок файлу видасть помилку
    w тільки запис початок файлу створить новий
    a тільки запис кінець файлу створить новий

    З метою читання з відкритого файлу на одному рядку за раз, можна використовувати функцію fgets().

    “;}
    while (!feof($file1));
    fclose($file1);

    Використання do-while-циклу є гарним вибором, щоб дізнатися заздалегідь, скільки рядків у файлі. Функція feof() перевіряє, чи досяг файл завершення, а цикл продовжується до тих пір, поки не буде досягнутий кінець умови файлу. Після закінчення читання використовується функція fclose() для закриття документа.

    Запис файлів

    Два часто використовуваних режиму при записі у файл з використанням функції fwrite(): «w» і «a». «W» означає, що потрібно записати в документ, але він попередньо видалить будь-який вміст, «a» – додавання нових дані до того, що вже існує у файлі. Потрібно бути впевненим, що використовується правильний варіант.

    У наступному прикладі буде використовуватися режиму «a» для запису.

    Спочатку ім’я файлу призначається змінної, потім він відкривається в режимі «a» для додавання. Дані, які повинні бути записані, призначаються змінної $output і fwrite(), а інформація додається файл. Процес повторюється, щоб додати ще один рядок, потім документ закривається з використанням fclose().

    Попередньо визначена константа PHP_EOL додає символ нового рядка, специфічний для платформи, на якій працює PHP з текстовими файлами.

    Вміст файлу після виконання вищевказаного коду має виглядати наступним чином:

    • банан;
    • Китай.

    Функція file_put_contents() також може записувати у файл. Вона приймає ім’я файлу, дані, які повинні бути записані і константу FILE_APPEND, якщо вона повинна містити дані (буде перезаписувати вміст файлу за замовчуванням).

    Ось такий самий приклад, як і вище, але на цей раз використовується file_put_contents().

    З цими функціями доводиться працювати часто, тому краще їх запам’ятати. До того ж вони можуть в роботі з файлами PHP якось полегшити деякі складні завдання.