20250608
[File] обновлён метод RemoveDir. Теперь он корректно удаляет не пустую директорию. [File] добавлен метод DirectoryExists (string $directory, bool $checkReadAccess = true, bool $checkWriteAccess = false): bool
This commit is contained in:
@@ -2,12 +2,15 @@
|
||||
|
||||
namespace goodboyalex\php_components_pack\classes;
|
||||
|
||||
use RecursiveDirectoryIterator;
|
||||
use RecursiveIteratorIterator;
|
||||
|
||||
/**
|
||||
* Класс, реализующий функционал работы с файлами и выполнение операций над файлами одной командой.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @version 1.0.1
|
||||
* @since 1.0.21
|
||||
*/
|
||||
final class File
|
||||
@@ -111,38 +114,67 @@ final class File
|
||||
*/
|
||||
public static function RemoveDir (string $directory): bool
|
||||
{
|
||||
// Если директории не существует
|
||||
if (!file_exists($directory))
|
||||
// - то удаление не требуется
|
||||
return true;
|
||||
// Проверяем, существует ли директория
|
||||
if (!self::DirectoryExists(directory: $directory, checkWriteAccess: true))
|
||||
// - если нет, то возвращаем false
|
||||
return false;
|
||||
|
||||
// Если это не директория
|
||||
if (!is_dir($directory))
|
||||
// - то удаляем файл
|
||||
return unlink($directory);
|
||||
// Получаем список файлов и каталогов в заданной директории
|
||||
$files = new RecursiveIteratorIterator(
|
||||
new RecursiveDirectoryIterator($directory),
|
||||
RecursiveIteratorIterator::CHILD_FIRST
|
||||
);
|
||||
|
||||
// Перебираем все файлы и поддиректории
|
||||
foreach (scandir($directory) as $item) {
|
||||
// - если это '.' или '..'
|
||||
if ($item == '.' || $item == '..')
|
||||
// -- то пропускаем
|
||||
continue;
|
||||
|
||||
// - задаём переменную - целевую директорию
|
||||
$target = $directory . DIRECTORY_SEPARATOR . $item;
|
||||
|
||||
// - если это директория
|
||||
if (is_dir($target))
|
||||
// -- то рекурсивно удаляем её
|
||||
if (!self::RemoveDir($target))
|
||||
// --- и прерываем удаление директории, если ошибка
|
||||
return false;
|
||||
else
|
||||
// -- иначе удаляем файл
|
||||
unlink($target);
|
||||
}
|
||||
// Перебираем файлы и каталоги
|
||||
foreach ($files as $file)
|
||||
// - если это каталог
|
||||
if ($file->isDir())
|
||||
// -- то удаляем его
|
||||
rmdir($file->getRealPath());
|
||||
else
|
||||
// -- иначе удаляем файл
|
||||
unlink($file->getRealPath());
|
||||
|
||||
// Удаляем директорию
|
||||
return rmdir($directory);
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет, существует ли директория.
|
||||
*
|
||||
* @param string $directory Путь к директории.
|
||||
* @param bool $checkReadAccess Проверять ли доступ на чтение директории (по умолчанию true).
|
||||
* @param bool $checkWriteAccess Проверять ли доступ на запись директории (по умолчанию false).
|
||||
*
|
||||
* @return bool Результат проверки.
|
||||
*/
|
||||
public static function DirectoryExists (string $directory, bool $checkReadAccess = true,
|
||||
bool $checkWriteAccess = false): bool
|
||||
{
|
||||
// Очищаем кэш
|
||||
clearstatcache();
|
||||
|
||||
// Проверяем, существует ли директория
|
||||
if (!file_exists($directory))
|
||||
// - если нет, то возвращаем false
|
||||
return false;
|
||||
|
||||
// Проверяем, является ли директория директорией, а не файлом
|
||||
if (!is_dir($directory))
|
||||
// - если нет, то возвращаем false
|
||||
return false;
|
||||
|
||||
// Проверяем, есть ли доступ на чтение директории
|
||||
if ($checkReadAccess && !is_readable($directory))
|
||||
// - если нет, то возвращаем false
|
||||
return false;
|
||||
|
||||
// Проверяем, есть ли доступ на запись директории
|
||||
if ($checkWriteAccess && !is_writable($directory))
|
||||
// - если нет, то возвращаем false
|
||||
return false;
|
||||
|
||||
// Если все проверки пройдены успешно, то возвращаем true
|
||||
return true;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user