From ea44f0e20f9685e5d8396380a5fcb383d9efee90 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 1 Jul 2013 18:11:05 +0200 Subject: [PATCH] fix recursive copy and rename for common storage backend --- lib/private/files/storage/common.php | 47 ++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/lib/private/files/storage/common.php b/lib/private/files/storage/common.php index cfca8ca008..5fae43d8bf 100644 --- a/lib/private/files/storage/common.php +++ b/lib/private/files/storage/common.php @@ -137,20 +137,49 @@ abstract class Common implements \OC\Files\Storage\Storage { } public function rename($path1, $path2) { - if ($this->copy($path1, $path2)) { - $this->removeCachedFile($path1); - return $this->unlink($path1); + if ($this->file_exists($path2)) { + if ($this->is_dir($path2)) { + $this->rmdir($path2); + } else if ($this->is_file($path2)) { + $this->unlink($path2); + } + } + + $this->removeCachedFile($path1); + if ($this->is_dir($path1)) { + return $this->copy($path1, $path2) and $this->rmdir($path1); } else { - return false; + return $this->copy($path1, $path2) and $this->unlink($path1); } } public function copy($path1, $path2) { - $source = $this->fopen($path1, 'r'); - $target = $this->fopen($path2, 'w'); - list($count, $result) = \OC_Helper::streamCopy($source, $target); - $this->removeCachedFile($path2); - return $result; + if ($this->is_dir($path1)) { + if ($this->file_exists($path2)) { + if ($this->is_dir($path2)) { + $this->rmdir($path2); + } else if ($this->is_file($path2)) { + $this->unlink($path2); + } + } + $dir = $this->opendir($path1); + $this->mkdir($path2); + while ($file = readdir($dir)) { + if (($file != '.') && ($file != '..')) { + if (!$this->copy($path1 . '/' . $file, $path2 . '/' . $file)) { + return false; + } + } + } + closedir($dir); + return true; + } else { + $source = $this->fopen($path1, 'r'); + $target = $this->fopen($path2, 'w'); + list(, $result) = \OC_Helper::streamCopy($source, $target); + $this->removeCachedFile($path2); + return $result; + } } public function getMimeType($path) {