157 lines
4.0 KiB
PHP
157 lines
4.0 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of TemporaryFilesystem.
|
|
*
|
|
* (c) Romain Neutron <imprec@gmail.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Neutron\TemporaryFilesystem;
|
|
|
|
use Symfony\Component\Filesystem\Filesystem;
|
|
use Symfony\Component\Filesystem\Exception\IOException as SfIOException;
|
|
|
|
class Manager implements TemporaryFilesystemInterface
|
|
{
|
|
/** @var Filesystem */
|
|
private $fs;
|
|
/** @var TemporaryFilesystem */
|
|
private $tmpFs;
|
|
/** @var array */
|
|
private $files = array();
|
|
|
|
const DEFAULT_SCOPE = '_tmp_fs_';
|
|
|
|
public function __construct(TemporaryFilesystemInterface $tmpFs, Filesystem $fs)
|
|
{
|
|
$this->fs = $fs;
|
|
$this->tmpFs = $tmpFs;
|
|
|
|
register_shutdown_function(array($this, 'clean'), null, false);
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function createEmptyFile($basePath, $prefix = self::DEFAULT_SCOPE, $suffix = null, $extension = null, $maxTry = 65536)
|
|
{
|
|
$file = $this->tmpFs->createEmptyFile($basePath, $prefix, $suffix, $extension, $maxTry);
|
|
$this->add($file, $prefix);
|
|
|
|
return $file;
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function createTemporaryDirectory($mode = 0777, $maxTry = 65536, $prefix = self::DEFAULT_SCOPE)
|
|
{
|
|
$dir = $this->tmpFs->createTemporaryDirectory($mode, $maxTry, $prefix);
|
|
$this->add($dir, $prefix);
|
|
|
|
return $dir;
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function createTemporaryFile($prefix = self::DEFAULT_SCOPE, $suffix = null, $extension = null, $maxTry = 65536)
|
|
{
|
|
$file = $this->tmpFs->createTemporaryFile($prefix, $suffix, $extension, $maxTry);
|
|
$this->add($file, $prefix);
|
|
|
|
return $file;
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function createTemporaryFiles($quantity = 1, $prefix = self::DEFAULT_SCOPE, $suffix = null, $extension = null, $maxTry = 65536)
|
|
{
|
|
$files = $this->tmpFs->createTemporaryFiles($quantity, $prefix, $suffix, $extension, $maxTry);
|
|
$this->add($files, $prefix);
|
|
|
|
return $files;
|
|
}
|
|
|
|
/**
|
|
* Adds file to be handled by the manager.
|
|
*
|
|
* @param string|array $files
|
|
* @param string $scope
|
|
*
|
|
* @return Manager
|
|
*/
|
|
public function add($files, $scope = self::DEFAULT_SCOPE)
|
|
{
|
|
if (!is_array($files)) {
|
|
$files = array($files);
|
|
}
|
|
if ('' === trim($scope)) {
|
|
$scope = self::DEFAULT_SCOPE;
|
|
}
|
|
if (!isset($this->files[$scope])) {
|
|
$this->files[$scope] = array();
|
|
}
|
|
|
|
$this->files[$scope] = array_merge($this->files[$scope], $files);
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Removes all managed files in a scope. If no scope provided, all scopes
|
|
* are cleared.
|
|
*
|
|
* @param string $scope
|
|
*
|
|
* @return Manager
|
|
*
|
|
* @throws IOException
|
|
*/
|
|
public function clean($scope = null, $throwException = true)
|
|
{
|
|
if (null !== $scope) {
|
|
$this->cleanScope($scope, $throwException);
|
|
} else {
|
|
foreach ($this->files as $scope => $files) {
|
|
$this->cleanScope($scope, $throwException);
|
|
}
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Factory for the Manager
|
|
*
|
|
* @return Manager
|
|
*/
|
|
public static function create()
|
|
{
|
|
$fs = new Filesystem();
|
|
|
|
return new static(new TemporaryFilesystem($fs), $fs);
|
|
}
|
|
|
|
private function cleanScope($scope, $throwException)
|
|
{
|
|
if (!isset($this->files[$scope])) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
$this->fs->remove($this->files[$scope]);
|
|
unset($this->files[$scope]);
|
|
} catch (SfIOException $e) {
|
|
unset($this->files[$scope]);
|
|
if ($throwException) {
|
|
throw new IOException('Unable to remove all the files', $e->getCode(), $e);
|
|
}
|
|
}
|
|
}
|
|
}
|