Primo Committ
This commit is contained in:
172
vendor/spatie/temporary-directory/src/TemporaryDirectory.php
vendored
Normal file
172
vendor/spatie/temporary-directory/src/TemporaryDirectory.php
vendored
Normal file
@@ -0,0 +1,172 @@
|
||||
<?php
|
||||
|
||||
namespace Spatie\TemporaryDirectory;
|
||||
|
||||
use Exception;
|
||||
use FilesystemIterator;
|
||||
use InvalidArgumentException;
|
||||
|
||||
class TemporaryDirectory
|
||||
{
|
||||
/** @var string */
|
||||
protected $location;
|
||||
|
||||
/** @var string */
|
||||
protected $name;
|
||||
|
||||
/** @var bool */
|
||||
protected $forceCreate = false;
|
||||
|
||||
public function __construct(string $location = '')
|
||||
{
|
||||
$this->location = $this->sanitizePath($location);
|
||||
}
|
||||
|
||||
public function create(): self
|
||||
{
|
||||
if (empty($this->location)) {
|
||||
$this->location = $this->getSystemTemporaryDirectory();
|
||||
}
|
||||
|
||||
if (empty($this->name)) {
|
||||
$this->name = mt_rand().'-'.str_replace([' ', '.'], '', microtime());
|
||||
}
|
||||
|
||||
if ($this->forceCreate && file_exists($this->getFullPath())) {
|
||||
$this->deleteDirectory($this->getFullPath());
|
||||
}
|
||||
|
||||
if (file_exists($this->getFullPath())) {
|
||||
throw new InvalidArgumentException("Path `{$this->getFullPath()}` already exists.");
|
||||
}
|
||||
|
||||
mkdir($this->getFullPath(), 0777, true);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function force(): self
|
||||
{
|
||||
$this->forceCreate = true;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function name(string $name): self
|
||||
{
|
||||
$this->name = $this->sanitizeName($name);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function location(string $location): self
|
||||
{
|
||||
$this->location = $this->sanitizePath($location);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function path(string $pathOrFilename = ''): string
|
||||
{
|
||||
if (empty($pathOrFilename)) {
|
||||
return $this->getFullPath();
|
||||
}
|
||||
|
||||
$path = $this->getFullPath().DIRECTORY_SEPARATOR.trim($pathOrFilename, '/');
|
||||
|
||||
$directoryPath = $this->removeFilenameFromPath($path);
|
||||
|
||||
if (! file_exists($directoryPath)) {
|
||||
mkdir($directoryPath, 0777, true);
|
||||
}
|
||||
|
||||
return $path;
|
||||
}
|
||||
|
||||
public function empty(): self
|
||||
{
|
||||
$this->deleteDirectory($this->getFullPath());
|
||||
mkdir($this->getFullPath(), 0777, true);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function delete(): bool
|
||||
{
|
||||
return $this->deleteDirectory($this->getFullPath());
|
||||
}
|
||||
|
||||
protected function getFullPath(): string
|
||||
{
|
||||
return $this->location.($this->name ? DIRECTORY_SEPARATOR.$this->name : '');
|
||||
}
|
||||
|
||||
protected function isValidDirectoryName(string $directoryName): bool
|
||||
{
|
||||
return strpbrk($directoryName, '\\/?%*:|"<>') === false;
|
||||
}
|
||||
|
||||
protected function getSystemTemporaryDirectory(): string
|
||||
{
|
||||
return rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR);
|
||||
}
|
||||
|
||||
protected function sanitizePath(string $path): string
|
||||
{
|
||||
$path = rtrim($path);
|
||||
|
||||
return rtrim($path, DIRECTORY_SEPARATOR);
|
||||
}
|
||||
|
||||
protected function sanitizeName(string $name): string
|
||||
{
|
||||
if (! $this->isValidDirectoryName($name)) {
|
||||
throw new Exception("The directory name `$name` contains invalid characters.");
|
||||
}
|
||||
|
||||
return trim($name);
|
||||
}
|
||||
|
||||
protected function removeFilenameFromPath(string $path): string
|
||||
{
|
||||
if (! $this->isFilePath($path)) {
|
||||
return $path;
|
||||
}
|
||||
|
||||
return substr($path, 0, strrpos($path, DIRECTORY_SEPARATOR));
|
||||
}
|
||||
|
||||
protected function isFilePath(string $path): bool
|
||||
{
|
||||
return strpos($path, '.') !== false;
|
||||
}
|
||||
|
||||
protected function deleteDirectory(string $path): bool
|
||||
{
|
||||
if (is_link($path)) {
|
||||
return unlink($path);
|
||||
}
|
||||
|
||||
if (! file_exists($path)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (! is_dir($path)) {
|
||||
return unlink($path);
|
||||
}
|
||||
|
||||
foreach (new FilesystemIterator($path) as $item) {
|
||||
if (! $this->deleteDirectory($item)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* By forcing a php garbage collection cycle using gc_collect_cycles() we can ensure
|
||||
* that the rmdir does not fail due to files still being reserved in memory.
|
||||
*/
|
||||
gc_collect_cycles();
|
||||
|
||||
return rmdir($path);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user