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