|
|
@@ -582,6 +582,8 @@ class Folder
|
|
|
$directory = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::KEY_AS_PATHNAME | RecursiveDirectoryIterator::CURRENT_AS_SELF);
|
|
|
$iterator = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST);
|
|
|
} catch (Exception $e) {
|
|
|
+ unset($directory, $iterator);
|
|
|
+
|
|
|
if ($type === null) {
|
|
|
return [[], []];
|
|
|
}
|
|
|
@@ -597,12 +599,14 @@ class Folder
|
|
|
if ($skipHidden) {
|
|
|
$subPathName = $fsIterator->getSubPathname();
|
|
|
if ($subPathName[0] === '.' || strpos($subPathName, DIRECTORY_SEPARATOR . '.') !== false) {
|
|
|
+ unset($fsIterator);
|
|
|
continue;
|
|
|
}
|
|
|
}
|
|
|
/** @var \FilesystemIterator $item */
|
|
|
$item = $fsIterator->current();
|
|
|
if (!empty($exceptions) && isset($exceptions[$item->getFilename()])) {
|
|
|
+ unset($fsIterator, $item);
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
@@ -611,7 +615,15 @@ class Folder
|
|
|
} elseif ($item->isDir() && !$item->isDot()) {
|
|
|
$directories[] = $itemPath;
|
|
|
}
|
|
|
+
|
|
|
+ // inner iterators need to be unset too in order for locks on parents to be released
|
|
|
+ unset($fsIterator, $item);
|
|
|
}
|
|
|
+
|
|
|
+ // unsetting iterators helps releasing possible locks in certain environments,
|
|
|
+ // which could otherwise make `rmdir()` fail
|
|
|
+ unset($directory, $iterator);
|
|
|
+
|
|
|
if ($type === null) {
|
|
|
return [$directories, $files];
|
|
|
}
|
|
|
@@ -731,6 +743,8 @@ class Folder
|
|
|
$directory = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::CURRENT_AS_SELF);
|
|
|
$iterator = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::CHILD_FIRST);
|
|
|
} catch (Exception $e) {
|
|
|
+ unset($directory, $iterator);
|
|
|
+
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
@@ -752,11 +766,18 @@ class Folder
|
|
|
} else {
|
|
|
$this->_errors[] = sprintf('%s NOT removed', $filePath);
|
|
|
|
|
|
+ // inner iterators need to be unset too in order for locks on parents to be released
|
|
|
+ unset($directory, $iterator, $item);
|
|
|
+
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // unsetting iterators helps releasing possible locks in certain environments,
|
|
|
+ // which could otherwise make `rmdir()` fail
|
|
|
+ unset($directory, $iterator);
|
|
|
+
|
|
|
$path = rtrim($path, DIRECTORY_SEPARATOR);
|
|
|
//@codingStandardsIgnoreStart
|
|
|
if (@rmdir($path)) {
|