FilesManagement::rrmdir()   B
last analyzed

Complexity

Conditions 9
Paths 7

Size

Total Lines 28
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 9
eloc 15
nc 7
nop 1
dl 0
loc 28
rs 8.0555
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace XoopsModules\Gbook\Common;
6
7
/*
8
 You may not change or alter any portion of this comment or credits
9
 of supporting developers from this source code or any supporting source code
10
 which is considered copyrighted (c) material of the original comment or credit authors.
11
12
 This program is distributed in the hope that it will be useful,
13
 but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15
 */
16
17
/**
18
 * @copyright   XOOPS Project (https://xoops.org)
19
 * @license     http://www.fsf.org/copyleft/gpl.html GNU public license
20
 * @author      mamba <[email protected]>
21
 */
22
trait FilesManagement
23
{
24
    /**
25
     * Function responsible for checking if a directory exists, we can also write in and create an index.html file
26
     *
27
     * @param string $folder The full path of the directory to check
28
     */
29
    public static function createFolder($folder): void
30
    {
31
        try {
32
            if (!\is_dir($folder)) {
33
                if (!\is_dir($folder) && !\mkdir($folder) && !\is_dir($folder)) {
34
                    throw new \RuntimeException(\sprintf('Unable to create the %s directory', $folder));
35
                }
36
37
                file_put_contents($folder . '/index.html', '<script>history.go(-1);</script>');
38
            }
39
        } catch (\Exception $e) {
40
            echo 'Caught exception: ', $e->getMessage(), "\n", '<br>';
41
        }
42
    }
43
44
    /**
45
     * @param $file
46
     * @param $folder
47
     * @return bool
48
     */
49
    public static function copyFile($file, $folder): bool
50
    {
51
        return \copy($file, $folder);
52
    }
53
54
    /**
55
     * @param $src
56
     * @param $dst
57
     */
58
    public static function recurseCopy($src, $dst): void
59
    {
60
        $dir = \opendir($src);
61
        //        @mkdir($dst);
62
        if (!@\mkdir($dst) && !\is_dir($dst)) {
63
            throw new \RuntimeException('The directory ' . $dst . ' could not be created.');
64
        }
65
        while (false !== ($file = \readdir($dir))) {
66
            if (('.' !== $file) && ('..' !== $file)) {
67
                if (\is_dir($src . '/' . $file)) {
68
                    self::recurseCopy($src . '/' . $file, $dst . '/' . $file);
69
                } else {
70
                    \copy($src . '/' . $file, $dst . '/' . $file);
71
                }
72
            }
73
        }
74
        \closedir($dir);
75
    }
76
77
    /**
78
     * Remove files and (sub)directories
79
     *
80
     * @param string $src source directory to delete
81
     *
82
     * @return bool true on success
83
     * @uses \Xmf\Module\Helper::isUserAdmin()
84
     *
85
     * @uses \Xmf\Module\Helper::getHelper()
86
     */
87
    public static function deleteDirectory($src): bool
88
    {
89
        // Only continue if user is a 'global' Admin
90
        if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) {
91
            return false;
92
        }
93
94
        $success = true;
95
        // remove old files
96
        $dirInfo = new \SplFileInfo($src);
97
        // validate is a directory
98
        if ($dirInfo->isDir()) {
99
            $fileList = \array_diff(\scandir($src, \SCANDIR_SORT_NONE), ['..', '.']);
100
            foreach ($fileList as $k => $v) {
101
                $fileInfo = new \SplFileInfo("{$src}/{$v}");
102
                if ($fileInfo->isDir()) {
103
                    // recursively handle subdirectories
104
                    if (!$success = self::deleteDirectory($fileInfo->getRealPath())) {
105
                        break;
106
                    }
107
                } elseif (!($success = \unlink($fileInfo->getRealPath()))) {
108
                    break;
109
                }
110
            }
111
            // now delete this (sub)directory if all the files are gone
112
            if ($success) {
113
                $success = \rmdir($dirInfo->getRealPath());
114
            }
115
        } else {
116
            // input is not a valid directory
117
            $success = false;
118
        }
119
120
        return $success;
121
    }
122
123
    /**
124
     * Recursively remove directory
125
     *
126
     * @todo currently won't remove directories with hidden files, should it?
127
     *
128
     * @param string $src directory to remove (delete)
129
     *
130
     * @return bool true on success
131
     */
132
    public static function rrmdir($src): bool
133
    {
134
        // Only continue if user is a 'global' Admin
135
        if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) {
136
            return false;
137
        }
138
139
        // If source is not a directory stop processing
140
        if (!\is_dir($src)) {
141
            return false;
142
        }
143
144
        // Open the source directory to read in files
145
        $iterator = new \DirectoryIterator($src);
146
        foreach ($iterator as $fObj) {
147
            if ($fObj->isFile()) {
148
                $filename = $fObj->getPathname();
149
                $fObj     = null; // clear this iterator object to close the file
0 ignored issues
show
Unused Code introduced by
The assignment to $fObj is dead and can be removed.
Loading history...
150
                if (!\unlink($filename)) {
151
                    return false; // couldn't delete the file
152
                }
153
            } elseif (!$fObj->isDot() && $fObj->isDir()) {
154
                // Try recursively on directory
155
                self::rrmdir($fObj->getPathname());
156
            }
157
        }
158
        $iterator = null;   // clear iterator Obj to close file/directory
0 ignored issues
show
Unused Code introduced by
The assignment to $iterator is dead and can be removed.
Loading history...
159
        return \rmdir($src); // remove the directory & return results
160
    }
161
162
    /**
163
     * Recursively move files from one directory to another
164
     *
165
     * @param string $src  - Source of files being moved
166
     * @param string $dest - Destination of files being moved
167
     *
168
     * @return bool true on success
169
     */
170
    public static function rmove($src, $dest): bool
171
    {
172
        // Only continue if user is a 'global' Admin
173
        if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) {
174
            return false;
175
        }
176
177
        // If source is not a directory stop processing
178
        if (!\is_dir($src)) {
179
            return false;
180
        }
181
182
        // If the destination directory does not exist and could not be created stop processing
183
        if (!\is_dir($dest) && !\mkdir($dest) && !\is_dir($dest)) {
184
            return false;
185
        }
186
187
        // Open the source directory to read in files
188
        $iterator = new \DirectoryIterator($src);
189
        foreach ($iterator as $fObj) {
190
            if ($fObj->isFile()) {
191
                \rename($fObj->getPathname(), "{$dest}/" . $fObj->getFilename());
192
            } elseif (!$fObj->isDot() && $fObj->isDir()) {
193
                // Try recursively on directory
194
                self::rmove($fObj->getPathname(), "{$dest}/" . $fObj->getFilename());
195
                //                rmdir($fObj->getPath()); // now delete the directory
196
            }
197
        }
198
        $iterator = null;   // clear iterator Obj to close file/directory
0 ignored issues
show
Unused Code introduced by
The assignment to $iterator is dead and can be removed.
Loading history...
199
        return \rmdir($src); // remove the directory & return results
200
    }
201
202
    /**
203
     * Recursively copy directories and files from one directory to another
204
     *
205
     * @param string $src  - Source of files being moved
206
     * @param string $dest - Destination of files being moved
207
     *
208
     * @return bool true on success
209
     * @uses \Xmf\Module\Helper::isUserAdmin()
210
     *
211
     * @uses \Xmf\Module\Helper::getHelper()
212
     */
213
    public static function rcopy($src, $dest): bool
214
    {
215
        // Only continue if user is a 'global' Admin
216
        if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) {
217
            return false;
218
        }
219
220
        // If source is not a directory stop processing
221
        if (!\is_dir($src)) {
222
            return false;
223
        }
224
225
        // If the destination directory does not exist and could not be created stop processing
226
        if (!\is_dir($dest) && !\mkdir($dest) && !\is_dir($dest)) {
227
            return false;
228
        }
229
230
        // Open the source directory to read in files
231
        $iterator = new \DirectoryIterator($src);
232
        foreach ($iterator as $fObj) {
233
            if ($fObj->isFile()) {
234
                \copy($fObj->getPathname(), "{$dest}/" . $fObj->getFilename());
235
            } elseif (!$fObj->isDot() && $fObj->isDir()) {
236
                self::rcopy($fObj->getPathname(), "{$dest}/" . $fObj->getFilename());
237
            }
238
        }
239
240
        return true;
241
    }
242
}
243