Passed
Push — master ( fd97e0...73464b )
by Michael
02:21 queued 11s
created

FilesManagement::rcopy()   B

Complexity

Conditions 11
Paths 7

Size

Total Lines 28
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 11
eloc 13
nc 7
nop 2
dl 0
loc 28
rs 7.3166
c 0
b 0
f 0

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace XoopsModules\Xoopsmembers\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     http://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)
28
    {
29
        try {
30
            if (!file_exists($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 (\Exception $e) {
38
            echo 'Caught exception: ', $e->getMessage(), "\n", '<br>';
39
        }
40
    }
41
42
    /**
43
     * @param $file
44
     * @param $folder
45
     * @return bool
46
     */
47
    public static function copyFile($file, $folder)
48
    {
49
        return copy($file, $folder);
50
    }
51
52
    /**
53
     * @param $src
54
     * @param $dst
55
     */
56
    public static function recurseCopy($src, $dst)
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))) {
0 ignored issues
show
Bug introduced by
It seems like $dir can also be of type false; however, parameter $dir_handle of readdir() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

63
        while (false !== ($file = readdir(/** @scrutinizer ignore-type */ $dir))) {
Loading history...
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);
0 ignored issues
show
Bug introduced by
It seems like $dir can also be of type false; however, parameter $dir_handle of closedir() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

72
        closedir(/** @scrutinizer ignore-type */ $dir);
Loading history...
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)
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), ['..', '.']);
0 ignored issues
show
Bug introduced by
It seems like scandir($src, XoopsModul...mmon\SCANDIR_SORT_NONE) can also be of type false; however, parameter $array1 of array_diff() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

97
            $fileList = array_diff(/** @scrutinizer ignore-type */ scandir($src, SCANDIR_SORT_NONE), ['..', '.']);
Loading history...
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
                } else {
106
                    // delete the file
107
                    if (!($success = unlink($fileInfo->getRealPath()))) {
108
                        break;
109
                    }
110
                }
111
            }
112
            // now delete this (sub)directory if all the files are gone
113
            if ($success) {
114
                $success = rmdir($dirInfo->getRealPath());
115
            }
116
        } else {
117
            // input is not a valid directory
118
            $success = false;
119
        }
120
121
        return $success;
122
    }
123
124
    /**
125
     * Recursively remove directory
126
     *
127
     * @todo currently won't remove directories with hidden files, should it?
128
     *
129
     * @param string $src directory to remove (delete)
130
     *
131
     * @return bool true on success
132
     */
133
    public static function rrmdir($src)
134
    {
135
        // Only continue if user is a 'global' Admin
136
        if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) {
137
            return false;
138
        }
139
140
        // If source is not a directory stop processing
141
        if (!is_dir($src)) {
142
            return false;
143
        }
144
145
        $success = true;
0 ignored issues
show
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
146
147
        // Open the source directory to read in files
148
        $iterator = new \DirectoryIterator($src);
149
        foreach ($iterator as $fObj) {
150
            if ($fObj->isFile()) {
151
                $filename = $fObj->getPathname();
152
                $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...
153
                if (!unlink($filename)) {
154
                    return false; // couldn't delete the file
155
                }
156
            } elseif (!$fObj->isDot() && $fObj->isDir()) {
157
                // Try recursively on directory
158
                self::rrmdir($fObj->getPathname());
159
            }
160
        }
161
        $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...
162
        return rmdir($src); // remove the directory & return results
163
    }
164
165
    /**
166
     * Recursively move files from one directory to another
167
     *
168
     * @param string $src  - Source of files being moved
169
     * @param string $dest - Destination of files being moved
170
     *
171
     * @return bool true on success
172
     */
173
    public static function rmove($src, $dest)
174
    {
175
        // Only continue if user is a 'global' Admin
176
        if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) {
177
            return false;
178
        }
179
180
        // If source is not a directory stop processing
181
        if (!is_dir($src)) {
182
            return false;
183
        }
184
185
        // If the destination directory does not exist and could not be created stop processing
186
        if (!is_dir($dest) && !mkdir($dest) && !is_dir($dest)) {
187
            return false;
188
        }
189
190
        // Open the source directory to read in files
191
        $iterator = new \DirectoryIterator($src);
192
        foreach ($iterator as $fObj) {
193
            if ($fObj->isFile()) {
194
                rename($fObj->getPathname(), "{$dest}/" . $fObj->getFilename());
195
            } elseif (!$fObj->isDot() && $fObj->isDir()) {
196
                // Try recursively on directory
197
                self::rmove($fObj->getPathname(), "{$dest}/" . $fObj->getFilename());
198
                //                rmdir($fObj->getPath()); // now delete the directory
199
            }
200
        }
201
        $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...
202
        return rmdir($src); // remove the directory & return results
203
    }
204
205
    /**
206
     * Recursively copy directories and files from one directory to another
207
     *
208
     * @param string $src  - Source of files being moved
209
     * @param string $dest - Destination of files being moved
210
     *
211
     * @return bool true on success
212
     * @uses \Xmf\Module\Helper::isUserAdmin()
213
     *
214
     * @uses \Xmf\Module\Helper::getHelper()
215
     */
216
    public static function rcopy($src, $dest)
217
    {
218
        // Only continue if user is a 'global' Admin
219
        if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) {
220
            return false;
221
        }
222
223
        // If source is not a directory stop processing
224
        if (!is_dir($src)) {
225
            return false;
226
        }
227
228
        // If the destination directory does not exist and could not be created stop processing
229
        if (!is_dir($dest) && !mkdir($dest) && !is_dir($dest)) {
230
            return false;
231
        }
232
233
        // Open the source directory to read in files
234
        $iterator = new \DirectoryIterator($src);
235
        foreach ($iterator as $fObj) {
236
            if ($fObj->isFile()) {
237
                copy($fObj->getPathname(), "{$dest}/" . $fObj->getFilename());
238
            } elseif (!$fObj->isDot() && $fObj->isDir()) {
239
                self::rcopy($fObj->getPathname(), "{$dest}/" . $fObj->getFilename());
240
            }
241
        }
242
243
        return true;
244
    }
245
}
246