]> BookStack Code Mirror - system-cli/blob - src/Services/Directories.php
Updated move to be a recursive copy+delete
[system-cli] / src / Services / Directories.php
1 <?php
2
3 namespace Cli\Services;
4 use RecursiveDirectoryIterator;
5 use RecursiveIteratorIterator;
6
7 class Directories
8 {
9
10     public static function move(string $src, string $target): void
11     {
12         static::copy($src, $target);
13         static::delete($src);
14     }
15
16     public static function copy(string $src, string $target): void
17     {
18         mkdir($target);
19
20         /** @var RecursiveDirectoryIterator $files */
21         $files = new RecursiveIteratorIterator(
22             new RecursiveDirectoryIterator($src, RecursiveDirectoryIterator::SKIP_DOTS),
23             RecursiveIteratorIterator::SELF_FIRST
24         );
25
26         /** @var \SplFileInfo $fileinfo */
27         foreach ($files as $fileinfo) {
28             $srcPath = $fileinfo->getRealPath();
29             $subPath = $files->getSubPathName();
30             $destPath = Paths::join($target, $subPath);
31             if ($fileinfo->isDir()) {
32                 $result = mkdir($destPath);
33             } else {
34                 $result = copy($srcPath, $destPath);
35             }
36
37             if ($result === false) {
38                 throw new \Exception("Failed to copy file or directory from {$srcPath} to {$destPath}");
39             }
40         }
41     }
42
43     public static function delete(string $dir): void
44     {
45         $files = new RecursiveIteratorIterator(
46             new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
47             RecursiveIteratorIterator::CHILD_FIRST
48         );
49
50         foreach ($files as $fileinfo) {
51             $path = $fileinfo->getRealPath();
52             if ($fileinfo->isDir()) {
53                 $result = rmdir($path);
54             } else {
55                 $result = unlink($path);
56             }
57
58             if ($result === false) {
59                 throw new \Exception("Failed to delete file or directory at {$path}");
60             }
61         }
62
63         rmdir($dir);
64     }
65 }