diff options
author | Robin Appelman <icewind@owncloud.com> | 2015-06-14 15:02:12 +0200 |
---|---|---|
committer | Robin Appelman <icewind@owncloud.com> | 2015-06-14 15:15:21 +0200 |
commit | 2fb8a767051aaeef48f53a974568e9ef7f6a7efd (patch) | |
tree | 5d813adddf99c294d8939d57875436008bc1f015 /lib/private | |
parent | 446f628136532fe556757c3fe39655c6304e3cb9 (diff) | |
download | nextcloud-server-2fb8a767051aaeef48f53a974568e9ef7f6a7efd.tar.gz nextcloud-server-2fb8a767051aaeef48f53a974568e9ef7f6a7efd.zip |
add recursive copy polyfill for storage backends
Diffstat (limited to 'lib/private')
-rw-r--r-- | lib/private/files/storage/polyfill/copydirectory.php | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/lib/private/files/storage/polyfill/copydirectory.php b/lib/private/files/storage/polyfill/copydirectory.php new file mode 100644 index 00000000000..64b11690dc2 --- /dev/null +++ b/lib/private/files/storage/polyfill/copydirectory.php @@ -0,0 +1,61 @@ +<?php +/** + * Copyright (c) 2015 Robin Appelman <icewind@owncloud.com> + * 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; + } +} |