diff --git a/src/Storage/Device/Local.php b/src/Storage/Device/Local.php index a587a7cf..a092c1e6 100644 --- a/src/Storage/Device/Local.php +++ b/src/Storage/Device/Local.php @@ -338,14 +338,26 @@ public function move(string $source, string $target): bool public function delete(string $path, bool $recursive = false): bool { if (\is_dir($path) && $recursive) { - $files = $this->getFiles($path); + $entries = \scandir($path); - foreach ($files as $file) { - $this->delete($file, true); + if ($entries === false) { + return false; } - \rmdir($path); - } elseif (\is_file($path) || \is_link($path)) { + foreach ($entries as $entry) { + if ($entry === '.' || $entry === '..') { + continue; + } + + if (! $this->delete($path.DIRECTORY_SEPARATOR.$entry, true)) { + return false; + } + } + + return \rmdir($path); + } + + if (\is_file($path) || \is_link($path)) { return \unlink($path); } diff --git a/tests/Storage/Device/LocalTest.php b/tests/Storage/Device/LocalTest.php index c3d91b23..544f0db9 100644 --- a/tests/Storage/Device/LocalTest.php +++ b/tests/Storage/Device/LocalTest.php @@ -107,6 +107,18 @@ public function testDelete() $this->assertEquals(is_readable($this->object->getPath('text-for-delete.txt')), false); } + public function testRecursiveDeleteRemovesHiddenFiles() + { + $directory = $this->object->getPath('delete-hidden'); + + $this->assertTrue($this->object->createDirectory($directory)); + $this->assertTrue($this->object->write($directory.DIRECTORY_SEPARATOR.'.hidden', 'secret')); + $this->assertTrue($this->object->write($directory.DIRECTORY_SEPARATOR.'visible', 'visible')); + + $this->assertTrue($this->object->delete($directory, true)); + $this->assertFalse($this->object->exists($directory)); + } + public function testFileSize() { $this->assertEquals($this->object->getFileSize(__DIR__.'/../../resources/disk-a/kitten-1.jpg'), 599639);