public async IAsyncEnumerable <ChildrenItem> GetChildrenAsync(ChildrenMode mode, string prefixDir) { for (var request = new ListObjectsRequest { BucketName = myBucketName, Prefix = string.IsNullOrEmpty(prefixDir) ? null : prefixDir.NormalizeLinux() + '/' };;) { var response = await myS3Client.ListObjectsAsync(request); foreach (var s3Object in response.S3Objects.Where(IsUserFile)) { yield return(new ChildrenItem { Name = s3Object.Key.NormalizeSystem(), Size = (mode & ChildrenMode.WithSize) != 0 ? s3Object.Size : -1 }); } request.Marker = response.NextMarker; if (!response.IsTruncated) { break; } } }
public async IAsyncEnumerable <ChildrenItem> GetChildrenAsync(ChildrenMode mode, [NotNull] string prefixDir) { var stack = new Stack <string>(); stack.Push(string.IsNullOrEmpty(prefixDir) ? myRootDir : Path.Combine(myRootDir, prefixDir)); while (stack.Count > 0) { var dir = stack.Pop(); foreach (var subDir in Directory.EnumerateDirectories(dir)) { stack.Push(subDir); } foreach (var file in Directory.EnumerateFiles(dir)) { yield return(new ChildrenItem { Name = Path.GetRelativePath(myRootDir, file), Size = (mode & ChildrenMode.WithSize) != 0 ? new FileInfo(file).Length : -1 }); } } }