. */ namespace SP\Infrastructure\File; use FilesystemIterator; use RecursiveDirectoryIterator; use RecursiveIteratorIterator; use SP\Domain\Core\Exceptions\FileNotFoundException; use SP\Domain\Core\Exceptions\InvalidClassException; use function SP\__; use function SP\__u; /** * Class FileSystem */ class FileSystem { private const IMAGE_MIME = [ 'image/jpeg', 'image/png', 'image/bmp', 'image/gif', ]; /** * Removes a directory in a recursive way * * @throws FileNotFoundException * @see https://stackoverflow.com/a/7288067 */ public static function rmdirRecursive(string $dir): bool { if (!is_dir($dir)) { throw new FileNotFoundException('Directory does not exist'); } $it = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir, FilesystemIterator::SKIP_DOTS ), RecursiveIteratorIterator::CHILD_FIRST ); foreach ($it as $file) { if ($file->isDir()) { rmdir($file->getPathname()); } else { unlink($file->getPathname()); } } return rmdir($dir); } public static function isImage(string $fileType): bool { return in_array(strtolower($fileType), self::IMAGE_MIME, true); } /** * @template T * @param string $file * @param class-string|null $class * * @return mixed|T * @throws FileException * @throws InvalidClassException */ public static function require(string $file, ?string $class = null): mixed { if (file_exists($file)) { $out = require $file; if ($class && class_exists($class) && !$out instanceof $class) { throw InvalidClassException::error(__u('Invalid class for loaded file data')); } return $out; } throw FileException::error(sprintf(__('File not found: %s'), $file)); } /** * Delete files using {@link glob()} patterns * * @param string $path * @param string ...$patterns * @return void */ public static function deleteByPattern(string $path, string...$patterns): void { array_map( static fn(string $file) => @unlink($file), array_merge(...array_map(static fn(string $pattern) => glob(self::buildPath($path, $pattern)), $patterns)) ); } /** * Return a well-formed path * * @param string ...$parts * @return string */ public static function buildPath(string ...$parts): string { return implode(DIRECTORY_SEPARATOR, $parts); } }