В этом разделе вы узнаете, как управлять иерархией директорий с использованием класса Vinograd\SimpleFiles\Directory
.
Этот класс предлагает два типа методов: структурные и прикладные. Структурные методы подготавливают объектную модель
директорий и файлов, в то время как прикладные методы предназначены для переноса модели на диск.
❗ Этот раздел описывает только структурные методы, прикладные же будут рассмотрены в следующих разделах данного руководства.
Для подготовки объектной модели каталогов существует 4 основных метода:
- addDirectory
- removeDirectory
- addFile
- removeFile
Важно отметить, что все эти методы не работают с реальной файловой системой, а всего лишь создают модель дерева файлов и директорий которую в последствии можно записать на диск, скопировать или удалить с диска.
Этот метод принимает на вход один аргумент Vinograd\SimpleFiles\AbstractDirectory
- это тот объект директории который
нужно добавить в качестве дочернего. Возвращает метод именно добавляемый объект.
Система разработана таким образом, чтобы один и тот же объект директории или файла не мог одновременно находиться в более чем одной директории. Когда вы добавляете дочерний элемент, он становится дочерним для того объекта, к которому вы его добавляете, и удаляется из списка дочерних элементов предыдущего родительского объекта.
Давайте рассмотрим пример в котором нам нужно сделать такое дерево папок:
root
|___child1
|___child2
|___child3
Код примера:
<?php
require_once dirname(__DIR__, 1) . '/vendor/autoload.php';
use Vinograd\SimpleFiles\Directory;
$root = new Directory('root');
$child1 = new Directory('child1');
$child2 = new Directory('child2');
$child3 = new Directory('child3');
$root->addDirectory($child1)->addDirectory($child2)->addDirectory($child3);
Наше дерево готово.
❗ Если вы попытаетесь добавить директорию с именем, которое уже существует среди дочерних элементов, это вызовет исключение
Vinograd\IO\Exception\AlreadyExistException
. Чтобы проверить, существует ли дочерняя директория с определенным именем, можно воспользоваться методомcontainsDirectory
, передав имя директории.if(!$parent->containsDirectory($directory->getLocalName())){ $parent->addDirectory($directory); }
Метод addDirectory
может добавить в качестве дочерней директории свою родительскую или даже корневую директорию без
каких-либо проблем. Это лучше всего можно продемонстрировать на примере.
Изменим получившуюся структуру так, чтобы корневым элементом стала директория child3
:
$child3->addDirectory($root);
Результат модификации:
|-------------------------|--------------------------|
| Было | Стало |
|-------------------------|--------------------------|
| root | child3 |
| |___child1 | |___root |
| |___child2 | |___child1 |
| |___child3 | |___child2 |
|-------------------------|--------------------------|
Продолжим манипуляцию и сделаем корневой директорию child1
.
Код:
$child1->addDirectory($child3);
Теперь наше дерево будет иметь такой вид:
child1
|___child2
|___child3
|___root
В полученном результате видно, что объект $child1
взял часть ветки начиная с корневой директории до самого себя и
добавил эту ветку к себе в дочерние элементы, после этого сам стал корневой директорией.
Этот метод призван удалять директории из списка дочерних.
❗ Удаляемая из списка директория должна присутствовать в списке, иначе будет выброшено исключение
Vinograd\SimpleFiles\Exception\TreeException
.
Пример удаления директории:
<?php
require_once dirname(__DIR__, 1) . '/vendor/autoload.php';
use Vinograd\SimpleFiles\Directory;
$root = new Directory('root');
$child1 = new Directory('child1');
$root->addDirectory($child1);
$root->removeDirectory($child1);
В начале мы создали два объекта директории, потом добавили одну директорию другой в качестве дочерней, и в последней строке кода удалили только что добавленную директорию. В результате обе директории остались корневыми без дочерних элементов.
Методы для работы с файлами имеют тот же принцип, что и методы работы с директориями.
Важно отметить, что метод addFile
имеет свойства, схожие с методом addDirectory
. В случае попытки добавить файл с
именем, которое уже существует в дочерних элементах, возникает исключение AlreadyExistException
. Заметьте, что файл не
может находиться в нескольких каталогах одновременно.
Метод removeFile
аналогичен методу removeDirectory
. Если файл, который требуется удалить, отсутствует в списке
дочерних элементов, возникает исключение TreeException
.
Пример добавления файла:
<?php
require_once dirname(__DIR__, 1) . '/vendor/autoload.php';
use Vinograd\SimpleFiles\Directory;
$root = new Directory('root');
$child1 = new Directory('child1');
$file1 = new File('file1.txt');
$file2 = new File('file2.txt');
$root->addDirectory($child1);
$root->addFile($file1);
$child1->addFile($file2);
В примере мы создали две папки и два файла, за тем вложили одну папку в другую и добавили по файлу в каждую из них.
Итог этих манипуляций такой:
root
|___child1
| |___file2.txt
|___file1.txt
Удалим фалы из обеих директорий:
$root->removeFile($file1);
$child1->removeFile($file2);
Результат:
root
|___child1
Директории стали пустые, но файлы никуда ни делись с ними можно делать какие-нибудь другие манипуляции.