fs

Форк
0
/
Dir.php 
103 строки · 2.4 Кб
1
<?php
2

3
declare(strict_types=1);
4

5
namespace Upside\Std\Fs;
6

7
final class Dir implements \Stringable
8
{
9
    private string $dir;
10

11
    public function __construct(string $dir)
12
    {
13
        $this->dir = $dir;
14
    }
15

16
    public function __toString(): string
17
    {
18
        return $this->dir;
19
    }
20

21
    public static function from(string $dir): self
22
    {
23
        return new self($dir);
24
    }
25

26
    public function remove(): self
27
    {
28
        return $this->clean()->rmdir($this->dir);
29
    }
30

31
    /**
32
     * Очищает директорию
33
     */
34
    public function clean(): self
35
    {
36
        /** @var iterable<\SplFileInfo> $iterator */
37
        $iterator = new \RecursiveIteratorIterator(
38
            new \RecursiveDirectoryIterator($this->dir, \FilesystemIterator::SKIP_DOTS),
39
            \RecursiveIteratorIterator::CHILD_FIRST
40
        );
41

42
        foreach ($iterator as $file) {
43
            if ($file->isDir()) {
44
                $this->rmdir($file->getPathname());
45
            } else {
46
                File::from($file->getPathname())->remove();
47
            }
48
        }
49

50
        return $this;
51
    }
52

53
    public function exists(): bool
54
    {
55
        return \is_dir($this->dir);
56
    }
57

58
    public function not_exists(): bool
59
    {
60
        return !$this->exists();
61
    }
62

63
    public function make(int $permissions = 0777): self
64
    {
65
        if ($this->not_exists()) {
66
            return $this->mkdir($this->dir, $permissions);
67
        }
68

69
        return $this;
70
    }
71

72
    public function rename(string $to): Dir
73
    {
74
        $to_dir = self::from($to);
75
        if ($to_dir->exists()) {
76
            throw new \RuntimeException(\sprintf('Cannot rename dir "%s" to "%s". Dir "%s" already exists.', $this->dir, $to, $to));
77
        }
78

79
        if (!\rename($this->dir, $to)) {
80
            throw new \RuntimeException(\sprintf('Directory "%s" was not renamed to "%s"', $this->dir, $to));
81
        }
82

83
        return $to_dir;
84
    }
85

86
    private function rmdir(string $directory): self
87
    {
88
        if (!\rmdir($directory)) {
89
            throw new \RuntimeException(\sprintf('Directory "%s" was not removed', $directory));
90
        }
91

92
        return $this;
93
    }
94

95
    private function mkdir(string $directory, int $permissions = 0777, bool $recursive = true): self
96
    {
97
        if (!\mkdir($directory, $permissions, $recursive) && !\is_dir($directory)) {
98
            throw new \RuntimeException(\sprintf('Directory "%s" was not created', $this->dir));
99
        }
100

101
        return $this;
102
    }
103
}
104

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.