]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix recursive copy and rename for common storage backend
authorRobin Appelman <icewind@owncloud.com>
Mon, 1 Jul 2013 16:11:05 +0000 (18:11 +0200)
committerRobin Appelman <icewind@owncloud.com>
Wed, 28 May 2014 16:16:23 +0000 (18:16 +0200)
lib/private/files/storage/common.php

index cfca8ca008c239ca2959d0e999c46e877a357f8c..5fae43d8bf73439429c1a5d49089b4b51238915f 100644 (file)
@@ -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) {