[File] обновлён метод RemoveDir. Теперь он корректно удаляет не пустую директорию.
[File] добавлен метод DirectoryExists (string $directory, bool $checkReadAccess = true,
                              bool $checkWriteAccess = false): bool
This commit is contained in:
2025-06-08 11:45:40 +03:00
parent 0730509096
commit 28dbf773f1
4 changed files with 94 additions and 48 deletions

View File

@@ -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;
}
}