FilesManagement   C
last analyzed

Complexity

Total Complexity 54

Size/Duplication

Total Lines 223
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 80
c 0
b 0
f 0
dl 0
loc 223
rs 6.4799
wmc 54

7 Methods

Rating   Name   Duplication   Size   Complexity  
A createFolder() 0 12 6
B rrmdir() 0 31 9
B rcopy() 0 28 11
A copyFile() 0 3 1
B rmove() 0 31 11
B recurseCopy() 0 17 7
B deleteDirectory() 0 34 9

How to fix   Complexity   

Complex Class

Complex classes like FilesManagement often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use FilesManagement, and based on these observations, apply Extract Interface, too.

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