Skip to content

Latest commit

 

History

History
118 lines (81 loc) · 6.58 KB

removing-directories.md

File metadata and controls

118 lines (81 loc) · 6.58 KB

Удаление директорий

В этом разделе рассматривается пример процесса удаления файлов и директорий. Процесс включает два основных этапа:

  1. Создание объектной модели дерева файлов и директорий связанных с файловой системой.
  2. Удаление файлов с диска на основе созданной модели.

Пример

В этом примере используются структурные методы для работы с объектами директорий. Если вы ещё не читали этот раздел, я рекомендую вам прочитать. Ссылка на раздел "Структурные методы директорий".

📌 Консольная команда в этом примере создается для выдуманного приложения. Для понимания как работает метод удаления и понимания структуры модуля в примере, следует прочитать раздел с описанием. Код для запуска можно скачать из этого репозитория.

Постановка задачи

Для очистки кеша требуется сделать консольную команду. Команда должна не иметь параметров и удалять папку example/var/cache с ее содержимым.

❗ Это концептуальный пример. Для простоты в примере мы исходим из того, что папка example/var/cache может содержать только файлы. Если в этой папке будут вложенные директории, этот пример не сработает. Чтобы была возможность удалять вложенные папки с файлами, нужно обходить директорию рекурсивно и собирать объектную модель в точности как на диске. Для понимания процесса удаления, данного примера вполне хватит.

Реализация

Напишем класс, который будет удалять папку example/var/cache.

<?php

namespace Example;

use Vinograd\SimpleFiles\Directory;
use Vinograd\SimpleFiles\File;

class CacheCleaner
{

    public function clean(string $path): void
    {
        $cacheFiles = glob($path . '/*');
        $varCacheDirectory = Directory::createBinded($path);
        foreach ($cacheFiles as $filePath) {
            $varCacheDirectory->addFile(File::createBinded($filePath));
        }
        $varCacheDirectory->delete();
    }

}

Класс состоит из одного метода clean, который принимает в качестве параметра абсолютный путь к папке example/var/cache.

Код тела метода состоит из трёх основных частей: получение всех путей к файлам в заданной папке, создание модели файловой системы на основе этих путей и, наконец, удаление с диска папки example/var/cache и всех содержащихся в ней файлов с использованием полученной модели.

Рассмотрим процесс. Функция glob находит все файлы на основе аргумента $path. Затем создается объект директории связанный с папкой по пути взятого из значения аргумента $path (.../example/var/cache) на диске. Далее, в цикле, создаются объекты файлов связанные с реальными файлами на диске и добавляются к объекту директории. Когда вся модель создана, у объекта директории вызывается метод delete.

❗ Важной особенностью метода “delete” является то, что после его вызова не только удаляются файлы и директории с диска, но и разрушаются все внутренние связи удаляемой модели. Такая модель становится непригодной для последующего использования в коде.

Напишем “файл запуска”, в котором проверим, существует ли папка example/var/cache. Если она существует, вызовем метод clean у созданного объекта \Example\CacheCleaner, передав в него путь к папке с кешем.

Код:

#!/usr/bin/env php
<?php
declare(strict_types=1);

require_once dirname(__DIR__, 1) . '/vendor/autoload.php';

if (PHP_SAPI !== 'cli') exit(1);

$varPath = realpath(__DIR__ . '/../var');
$varCachePath = $varPath . '/cache';

$message = 'The cache has been cleared.' . PHP_EOL;

if (!is_dir($varCachePath)) {
    echo $message;
    exit(0);
}

(new \Example\CacheCleaner())->clean($varCachePath);
echo $message;

В итоге команда для очистки кеша будет такой:

php delete

Пример для запуска вы можете клонировать себе из этого репозитория.

Чтобы запустить команду, перейдите в консоли в папку bin скачанного проекта:

cd path/to/cloned/example/bin/

Где path/to/cloned та папка, в которую вы скачали пример. После этого можно очистить кеш командой php delete.

В проекте с примером уже создана папка example/var/cache в которой лежат три файла, имитирующих кеш. После выполнения команды будут удалены эти три файла в месте с директорией example/var/cache.

К оглавлению