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); + } }