From ae98162d06ebf3318c112a7990cca37d9c2fe24f Mon Sep 17 00:00:00 2001 From: rameel Date: Fri, 1 Aug 2025 01:06:44 +0500 Subject: [PATCH] Optimize Amazon S3Directory enumeration Override base implementation to avoid unnecessary object creation and filtering. --- src/Ramstack.FileSystem.Amazon/S3Directory.cs | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/Ramstack.FileSystem.Amazon/S3Directory.cs b/src/Ramstack.FileSystem.Amazon/S3Directory.cs index f9e5fa3..0207d57 100644 --- a/src/Ramstack.FileSystem.Amazon/S3Directory.cs +++ b/src/Ramstack.FileSystem.Amazon/S3Directory.cs @@ -103,4 +103,52 @@ protected override async IAsyncEnumerable GetFileNodesCoreAsync([En } while (request.ContinuationToken is not null && !cancellationToken.IsCancellationRequested); } + + /// + protected override async IAsyncEnumerable GetFilesCoreAsync([EnumeratorCancellation] CancellationToken cancellationToken) + { + var request = new ListObjectsV2Request + { + BucketName = _fs.BucketName, + Prefix = _prefix, + Delimiter = "/" + }; + + do + { + var response = await _fs.AmazonClient + .ListObjectsV2Async(request, cancellationToken) + .ConfigureAwait(false); + + foreach (var obj in response.S3Objects) + yield return new S3File(_fs, VirtualPath.Normalize(obj.Key)); + + request.ContinuationToken = response.NextContinuationToken; + } + while (request.ContinuationToken is not null && !cancellationToken.IsCancellationRequested); + } + + /// + protected override async IAsyncEnumerable GetDirectoriesCoreAsync([EnumeratorCancellation] CancellationToken cancellationToken) + { + var request = new ListObjectsV2Request + { + BucketName = _fs.BucketName, + Prefix = _prefix, + Delimiter = "/" + }; + + do + { + var response = await _fs.AmazonClient + .ListObjectsV2Async(request, cancellationToken) + .ConfigureAwait(false); + + foreach (var prefix in response.CommonPrefixes) + yield return new S3Directory(_fs, VirtualPath.Normalize(prefix)); + + request.ContinuationToken = response.NextContinuationToken; + } + while (request.ContinuationToken is not null && !cancellationToken.IsCancellationRequested); + } }