diff --git a/src/Storage/Device/S3.php b/src/Storage/Device/S3.php index c21bb9cb..cab37c82 100644 --- a/src/Storage/Device/S3.php +++ b/src/Storage/Device/S3.php @@ -616,7 +616,7 @@ public function deletePath(string $path): bool } /** - * Check if file exists + * Check if file or directory exists * * @param string $path * @return bool @@ -625,11 +625,29 @@ public function exists(string $path): bool { try { $this->getInfo($path); + + return true; } catch (\Throwable $th) { - return false; - } + try { + $root = $this->getRoot(); + if (str_starts_with($path, $root.'/') || str_starts_with($path, $root.'\\')) { + $prefix = $path; + } else { + $prefix = $root.'/'.ltrim($path, '/'); + } - return true; + if (! empty($path) && ! str_ends_with($prefix, '/')) { + $prefix .= '/'; + } + + $objects = $this->listObjects($prefix, 1); + $count = (int) ($objects['KeyCount'] ?? 0); + + return $count > 0; + } catch (\Throwable $th2) { + return false; + } + } } /** diff --git a/tests/Storage/Device/LocalTest.php b/tests/Storage/Device/LocalTest.php index c3d91b23..124accec 100644 --- a/tests/Storage/Device/LocalTest.php +++ b/tests/Storage/Device/LocalTest.php @@ -84,6 +84,36 @@ public function testFileExists() $this->object->delete($this->object->getPath('text-for-test-exists.txt')); } + public function testDirectoryExists() + { + $this->assertEquals(false, $this->object->exists($this->object->getPath('nonexistent-directory'))); + $this->assertEquals(false, $this->object->exists($this->object->getPath('nonexistent-directory/'))); + + $testDir = $this->object->getPath('test-directory-exists'); + $this->assertTrue($this->object->createDirectory($testDir)); + $this->assertEquals(true, $this->object->exists($testDir)); + $this->assertEquals(true, $this->object->exists($testDir.'/')); + + $nestedDir = $testDir.'/nested/deep/structure'; + $this->assertTrue($this->object->createDirectory($nestedDir)); + $this->object->write($nestedDir.'/test.txt', 'Hello World'); + + $this->assertEquals(true, $this->object->exists($testDir.'/nested')); + $this->assertEquals(true, $this->object->exists($testDir.'/nested/')); + $this->assertEquals(true, $this->object->exists($testDir.'/nested/deep')); + $this->assertEquals(true, $this->object->exists($testDir.'/nested/deep/')); + $this->assertEquals(true, $this->object->exists($nestedDir)); + $this->assertEquals(true, $this->object->exists($nestedDir.'/')); + + $this->assertEquals(true, $this->object->exists($nestedDir.'/test.txt')); + + $this->object->delete($testDir, true); + + $this->assertEquals(false, $this->object->exists($testDir)); + $this->assertEquals(false, $this->object->exists($testDir.'/nested')); + $this->assertEquals(false, $this->object->exists($nestedDir)); + } + public function testMove() { $this->assertEquals($this->object->write($this->object->getPath('text-for-move.txt'), 'Hello World'), true); diff --git a/tests/Storage/S3Base.php b/tests/Storage/S3Base.php index 314cfe02..338537a3 100644 --- a/tests/Storage/S3Base.php +++ b/tests/Storage/S3Base.php @@ -20,6 +20,11 @@ abstract protected function getAdapterName(): string; */ abstract protected function getAdapterDescription(): string; + /** + * @return string + */ + abstract protected function getAdapterType(): string; + /** * @var S3 */ @@ -139,6 +144,27 @@ public function testFileExists() $this->assertEquals(false, $this->object->exists($this->object->getPath('testing/kitten-5.jpg'))); } + public function testDirectoryExists() + { + $this->assertEquals(true, $this->object->exists($this->object->getPath('testing/'))); + + $this->assertEquals(false, $this->object->exists($this->object->getPath('nonexistent/'))); + + $this->object->write($this->object->getPath('nested/deep/structure/test.txt'), 'Hello World', 'text/plain'); + + $this->assertEquals(true, $this->object->exists($this->object->getPath('nested'))); + $this->assertEquals(true, $this->object->exists($this->object->getPath('nested/deep'))); + $this->assertEquals(true, $this->object->exists($this->object->getPath('nested/deep/structure'))); + + $this->assertEquals(true, $this->object->exists($this->object->getPath('nested/deep/structure/test.txt'))); + + $this->object->delete($this->object->getPath('nested/deep/structure/test.txt')); + + $this->assertEquals(false, $this->object->exists($this->object->getPath('nested'))); + $this->assertEquals(false, $this->object->exists($this->object->getPath('nested/deep'))); + $this->assertEquals(false, $this->object->exists($this->object->getPath('nested/deep/structure'))); + } + public function testMove() { $this->assertEquals(true, $this->object->write($this->object->getPath('text-for-move.txt'), 'Hello World', 'text/plain'));