Skip to content

Latest commit

 

History

History
190 lines (134 loc) · 8.44 KB

directory-structural-methods.md

File metadata and controls

190 lines (134 loc) · 8.44 KB

Структурные методы директорий

В этом разделе вы узнаете, как управлять иерархией директорий с использованием класса Vinograd\SimpleFiles\Directory. Этот класс предлагает два типа методов: структурные и прикладные. Структурные методы подготавливают объектную модель директорий и файлов, в то время как прикладные методы предназначены для переноса модели на диск.

❗ Этот раздел описывает только структурные методы, прикладные же будут рассмотрены в следующих разделах данного руководства.

Для подготовки объектной модели каталогов существует 4 основных метода:

  • addDirectory
  • removeDirectory
  • addFile
  • removeFile

Важно отметить, что все эти методы не работают с реальной файловой системой, а всего лишь создают модель дерева файлов и директорий которую в последствии можно записать на диск, скопировать или удалить с диска.

Метод addDirectory

Этот метод принимает на вход один аргумент 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 взял часть ветки начиная с корневой директории до самого себя и добавил эту ветку к себе в дочерние элементы, после этого сам стал корневой директорией.

Метод removeDirectory

Этот метод призван удалять директории из списка дочерних.

❗ Удаляемая из списка директория должна присутствовать в списке, иначе будет выброшено исключение 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

Директории стали пустые, но файлы никуда ни делись с ними можно делать какие-нибудь другие манипуляции.

К оглавлению