diff --git a/apps/files_external/3rdparty/smb4php/smb.php b/apps/files_external/3rdparty/smb4php/smb.php index 9650f80904..87638271f0 100644 --- a/apps/files_external/3rdparty/smb4php/smb.php +++ b/apps/files_external/3rdparty/smb4php/smb.php @@ -302,6 +302,7 @@ class smb { } function rename ($url_from, $url_to) { + $replace = false; list ($from, $to) = array (smb::parse_url($url_from), smb::parse_url($url_to)); if ($from['host'] <> $to['host'] || $from['share'] <> $to['share'] || @@ -314,7 +315,20 @@ class smb { trigger_error('rename(): error in URL', E_USER_ERROR); } smb::clearstatcache ($url_from); - $result = smb::execute ('rename "'.$from['path'].'" "'.$to['path'].'"', $to); + $cmd = ''; + // check if target file exists + if (smb::url_stat($url_to)) { + // delete target file first + $cmd = 'del "' . $to['path'] . '"; '; + $replace = true; + } + $cmd .= 'rename "' . $from['path'] . '" "' . $to['path'] . '"'; + $result = smb::execute($cmd, $to); + if ($replace) { + // clear again, else the cache will return the info + // from the old file + smb::clearstatcache ($url_to); + } return $result !== false; } diff --git a/apps/files_external/lib/streamwrapper.php b/apps/files_external/lib/streamwrapper.php index aa42cbde82..7a1991d4f0 100644 --- a/apps/files_external/lib/streamwrapper.php +++ b/apps/files_external/lib/streamwrapper.php @@ -38,7 +38,7 @@ abstract class StreamWrapper extends Common { } public function filetype($path) { - return filetype($this->constructUrl($path)); + return @filetype($this->constructUrl($path)); } public function file_exists($path) { diff --git a/tests/lib/files/storage/storage.php b/tests/lib/files/storage/storage.php index 5b5b855685..19113f5262 100644 --- a/tests/lib/files/storage/storage.php +++ b/tests/lib/files/storage/storage.php @@ -139,7 +139,15 @@ abstract class Storage extends \PHPUnit_Framework_TestCase { $this->instance->rename('/source.txt', '/target2.txt'); $this->assertTrue($this->instance->file_exists('/target2.txt')); $this->assertFalse($this->instance->file_exists('/source.txt')); - $this->assertEquals(file_get_contents($textFile), $this->instance->file_get_contents('/target.txt')); + $this->assertEquals(file_get_contents($textFile), $this->instance->file_get_contents('/target2.txt')); + + // move to overwrite + $testContents = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $this->instance->file_put_contents('/target3.txt', $testContents); + $this->instance->rename('/target2.txt', '/target3.txt'); + $this->assertTrue($this->instance->file_exists('/target3.txt')); + $this->assertFalse($this->instance->file_exists('/target2.txt')); + $this->assertEquals(file_get_contents($textFile), $this->instance->file_get_contents('/target3.txt')); } public function testLocal() {