/// <summary> /// list blobs by blob prefix and container name /// </summary> /// <param name="containerName">container name</param> /// <param name="prefix">blob preifx</param> /// <returns>An enumerable collection of IListBlobItem</returns> internal async Task ListBlobsByPrefix(long taskId, IStorageBlobManagement localChannel, string containerName, string prefix, Func <CloudBlob, bool> blobFilter = null, bool includeDeleted = false) { CloudBlobContainer container = await GetCloudBlobContainerByName(localChannel, containerName).ConfigureAwait(false); BlobRequestOptions requestOptions = RequestOptions; bool useFlatBlobListing = true; BlobListingDetails details = BlobListingDetails.Snapshots | BlobListingDetails.Metadata | BlobListingDetails.Copy; if (includeDeleted) { details = details | BlobListingDetails.Deleted; } int listCount = InternalMaxCount; int MaxListCount = 5000; int requestCount = MaxListCount; int realListCount = 0; BlobContinuationToken continuationToken = ContinuationToken; do { requestCount = Math.Min(listCount, MaxListCount); realListCount = 0; BlobResultSegment blobResult = await localChannel.ListBlobsSegmentedAsync(container, prefix, useFlatBlobListing, details, requestCount, continuationToken, requestOptions, OperationContext, CmdletCancellationToken).ConfigureAwait(false); foreach (IListBlobItem blobItem in blobResult.Results) { CloudBlob blob = blobItem as CloudBlob; if (blob == null) { continue; } if (blobFilter == null || blobFilter(blob)) { WriteCloudBlobObject(taskId, localChannel, blob, blobResult.ContinuationToken); realListCount++; } } if (InternalMaxCount != int.MaxValue) { listCount -= realListCount; } continuationToken = blobResult.ContinuationToken; }while (listCount > 0 && continuationToken != null); }
/// <summary> /// list blobs by blob prefix and container name /// </summary> /// <param name="containerName">container name</param> /// <param name="prefix">blob preifx</param> /// <returns>An enumerable collection of IListBlobItem</returns> internal async Task ListBlobsByPrefix(long taskId, IStorageBlobManagement localChannel, string containerName, string prefix, Func<CloudBlob, bool> blobFilter = null) { CloudBlobContainer container = await GetCloudBlobContainerByName(localChannel, containerName); BlobRequestOptions requestOptions = RequestOptions; bool useFlatBlobListing = true; BlobListingDetails details = BlobListingDetails.Snapshots | BlobListingDetails.Metadata | BlobListingDetails.Copy; int listCount = InternalMaxCount; int MaxListCount = 5000; int requestCount = MaxListCount; int realListCount = 0; BlobContinuationToken continuationToken = ContinuationToken; do { requestCount = Math.Min(listCount, MaxListCount); realListCount = 0; BlobResultSegment blobResult = await localChannel.ListBlobsSegmentedAsync(container, prefix, useFlatBlobListing, details, requestCount, continuationToken, requestOptions, OperationContext, CmdletCancellationToken); foreach (IListBlobItem blobItem in blobResult.Results) { CloudBlob blob = blobItem as CloudBlob; if (blob == null) { continue; } if (blobFilter == null || blobFilter(blob)) { WriteCloudBlobObject(taskId, localChannel, blob, blobResult.ContinuationToken); realListCount++; } } if (InternalMaxCount != int.MaxValue) { listCount -= realListCount; } continuationToken = blobResult.ContinuationToken; } while (listCount > 0 && continuationToken != null); }
/// <summary> /// list blobs by blob prefix and container name /// </summary> /// <param name="containerName">container name</param> /// <param name="prefix">blob preifx</param> /// <returns>An enumerable collection of IListBlobItem</returns> internal async Task ListBlobsByPrefix(long taskId, IStorageBlobManagement localChannel, string containerName, string prefix, Func <string, bool> blobFilter = null, bool includeDeleted = false, bool includeVersion = false) { CloudBlobContainer container = await GetCloudBlobContainerByName(localChannel, containerName).ConfigureAwait(false); BlobContainerClient track2container = AzureStorageContainer.GetTrack2BlobContainerClient(container, localChannel.StorageContext, ClientOptions); int listCount = InternalMaxCount; int MaxListCount = 5000; int requestCount = MaxListCount; int realListCount = 0; BlobContinuationToken continuationToken = ContinuationToken; string track2ContinuationToken = this.ContinuationToken is null ? null : this.ContinuationToken.NextMarker; if (UseTrack2Sdk()) // For new feature only available on Track2 SDK, need list with Track2 SDK. { BlobTraits blobTraits = BlobTraits.Metadata | BlobTraits.CopyStatus; // | BlobTraits.Tags; BlobStates blobStates = BlobStates.Snapshots; if (includeDeleted) { blobStates = blobStates | BlobStates.Deleted; } if (includeVersion) { blobStates = blobStates | BlobStates.Version; } do { requestCount = Math.Min(listCount, MaxListCount); realListCount = 0; IEnumerator <Page <BlobItem> > enumerator = track2container.GetBlobs(blobTraits, blobStates, prefix, CmdletCancellationToken) .AsPages(track2ContinuationToken, requestCount) .GetEnumerator(); Page <BlobItem> page; enumerator.MoveNext(); page = enumerator.Current; foreach (BlobItem item in page.Values) { if (blobFilter == null || blobFilter(item.Name)) { OutputStream.WriteObject(taskId, GetAzureStorageBlob(item, track2container, localChannel.StorageContext, page.ContinuationToken, ClientOptions)); } realListCount++; } track2ContinuationToken = page.ContinuationToken; if (InternalMaxCount != int.MaxValue) { listCount -= realListCount; } } while (listCount > 0 && !string.IsNullOrEmpty(track2ContinuationToken)); } else { BlobRequestOptions requestOptions = RequestOptions; bool useFlatBlobListing = true; BlobListingDetails details = BlobListingDetails.Snapshots | BlobListingDetails.Metadata | BlobListingDetails.Copy; if (includeDeleted) { details = details | BlobListingDetails.Deleted; } do { requestCount = Math.Min(listCount, MaxListCount); realListCount = 0; BlobResultSegment blobResult = await localChannel.ListBlobsSegmentedAsync(container, prefix, useFlatBlobListing, details, requestCount, continuationToken, requestOptions, OperationContext, CmdletCancellationToken).ConfigureAwait(false); foreach (IListBlobItem blobItem in blobResult.Results) { CloudBlob blob = blobItem as CloudBlob; if (blob == null) { continue; } if (blobFilter == null || blobFilter(blob.Name)) { WriteCloudBlobObject(taskId, localChannel, blob, blobResult.ContinuationToken); realListCount++; } } if (InternalMaxCount != int.MaxValue) { listCount -= realListCount; } continuationToken = blobResult.ContinuationToken; }while (listCount > 0 && continuationToken != null); } }