diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2015-07-06 17:05:36 +0200 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2015-07-06 17:05:36 +0200 |
commit | 9120942bcfe474e758174ab52e4e35f62b477df4 (patch) | |
tree | 720216dde0e711408f17e7ec933ddc80bcd70d0d /lib/private/files/storage | |
parent | 14eef434fff78bf39a926b1f27220b9ad1ebb833 (diff) | |
parent | a0c089a1c9f72df782d2bde9c90eef7558746979 (diff) | |
download | nextcloud-server-9120942bcfe474e758174ab52e4e35f62b477df4.tar.gz nextcloud-server-9120942bcfe474e758174ab52e4e35f62b477df4.zip |
Merge pull request #16924 from owncloud/copy-recursive-polyfill
add recursive copy polyfill for storage backends
Diffstat (limited to 'lib/private/files/storage')
-rw-r--r-- | lib/private/files/storage/polyfill/copydirectory.php | 89 |
1 files changed, 89 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..1b4873a3a76 --- /dev/null +++ b/lib/private/files/storage/polyfill/copydirectory.php @@ -0,0 +1,89 @@ +<?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 { + /** + * Check if a path is a directory + * + * @param string $path + * @return bool + */ + abstract public function is_dir($path); + + /** + * Check if a file or folder exists + * + * @param string $path + * @return bool + */ + abstract public function file_exists($path); + + /** + * Delete a file or folder + * + * @param string $path + * @return bool + */ + abstract public function unlink($path); + + /** + * Open a directory handle for a folder + * + * @param string $path + * @return resource | bool + */ + abstract public function opendir($path); + + /** + * Create a new folder + * + * @param string $path + * @return bool + */ + abstract public function mkdir($path); + + public function copy($source, $target) { + if ($this->is_dir($source)) { + if ($this->file_exists($target)) { + $this->unlink($target); + } + $this->mkdir($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; + } +} |