Файли і каталоги в php - хочу веб-сайт

Файли і каталоги в php

Файли і каталоги в php - хочу веб-сайт

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

Отже перед нами стоїть завдання:

Отримати список файлів у поточному каталозі і відфільтрувати елементи з певними розширеннями файлів. визначаючи попутно розмір вибраних файлів і звичайно виводячи в браузер отримані нами дані.

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

Дійсно, а раптом у вибраному нами каталозі крім файлів знаходяться інші каталоги, а всередині них ще, ще і ще.

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

Ось як я це зробив:

Давайте крок за кроком розберемо код скрипта.
Спочатку я описуючи функцію read2Dir (). яка власне і буде виконувати всю роботу.

Вона приймає такі параметри:

$ Dir Директорія, яку ми будемо сканувати $ offs Параметр який визначає вид отсупа при виведенні даних в браузер

Потім за допомогою умовного оператора if (він просто записаний трохи по іншому) перевіряємо чи міститься слеш (/) в кінці директорії.

І якщо він там є, то залишаємо все як є, а в іншому випадку додаємо його в кінець.

І якщо це не так виходимо з функції повертаючи FALSE. Ну а якщо це все-таки каталог, то за допомогою функції opendir () отримуємо дескриптор каталогу для подальшого використання, який в свою чергу допомагає функції readdir () отримати елемент каталогу за цією самою дескриптору.

А отримувати елементи каталогу ми будемо в циклі whille до тих пір поки елемент каталогу існують - тобто Чи не тотожне FALSE. Або кажучи простіше в циклі будемо отримувати елементи поки вони не закінчаться.

Зверніть увагу, що перевіряти потрібно саме на тотожність.

У результаті повинна вийде приблизно такий рядок - (documents / file.txt). звичайно якщо отриманий елемент є файлом, ну а в іншому випадку отриманий елемент це каталог і відповідно нам потрібно знову виконати його сканування.

Для цього спочатку функцією basename (). яка повертає ім'я файлу із зазначеного шляху, перевіряємо чи не є отриманий елемент "." або ".."
Якщо це так то пропускаємо ітерацію циклу whille використовуючи оператор continue.

Далі визначаємо за допомогою функції filetype () визначаємо тип файлу.
Ця функція повертає одне з можливих значень: fifo, char, dir, block, link, file або unknown.

Але в нашому конкретному випадку нас цікавить тольлько dir. і якщо це так то тут то і запускаємо рекурсию.

Тобто знову викликаємо нашу функцію read2Dir (). тільки на цей раз передаємо їй поточний елемент і пристиковуватися (конкатеніруем) до змінної $ offset додатковий відступ.

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

Отримуємо їх використовуючи функцію substr (). яка повертає підрядок. Причому я вказав, що мене цікавлять саме останні 3 символу.

Ну а далі зовсім просто.
Якщо розширення відповідає призначеному нами, тоді за допомогою функції filesize (). яка повертає розмір зазначеного файлу в байтах або FALSE в разі виникнення помилки, отримуємо розмір файлу і оператором echo виводимо його в браузер.

Попрацювали? Тоді не забуваємо звільнити дескриптор каталогу функцією closedir (). яка закриває потік пов'язаний з каталогом.


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


Або ж за допомогою функції getcwd (). котра повертає ім'я поточного робочого каталогу.

Експериментуйте на здоров'я!

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

На цьому сьогодні все. Із задоволенням відповім на ваші питання, якщо вони у вас є. До побачення.

Схожі статті