From 2fb8a767051aaeef48f53a974568e9ef7f6a7efd Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 14 Jun 2015 15:02:12 +0200 Subject: [PATCH] add recursive copy polyfill for storage backends --- .../files/storage/polyfill/copydirectory.php | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 lib/private/files/storage/polyfill/copydirectory.php diff --git a/lib/private/files/storage/polyfill/copydirectory.php b/lib/private/files/storage/polyfill/copydirectory.php new file mode 100644 index 0000000000..64b11690dc --- /dev/null +++ b/lib/private/files/storage/polyfill/copydirectory.php @@ -0,0 +1,61 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\Files\Storage\PolyFill; + +trait CopyDirectory { + abstract public function is_dir($path); + + abstract public function file_exists($path); + + abstract public function buildPath($path); + + abstract public function unlink($path); + + abstract public function opendir($path); + + abstract public function mkdir($path); + + public function copy($source, $target) { + if ($this->is_dir($source)) { + if ($this->file_exists($target)) { + $this->unlink($target); + } + parent::copy($source, $target); + return $this->copyRecursive($source, $target); + } else { + return parent::copy($source, $target); + } + } + + /** + * For adapters that dont support copying folders natively + * + * @param $source + * @param $target + * @return bool + */ + protected function copyRecursive($source, $target) { + $dh = $this->opendir($source); + $result = true; + while ($file = readdir($dh)) { + if ($file !== '.' and $file !== '..') { + if ($this->is_dir($source . '/' . $file)) { + $this->mkdir($target . '/' . $file); + $result = $this->copyRecursive($source . '/' . $file, $target . '/' . $file); + } else { + $result = parent::copy($source . '/' . $file, $target . '/' . $file); + } + if (!$result) { + break; + } + } + } + return $result; + } +}