public static IList<CloudBlockBlob> CollectBlobs(Logger log, CloudBlobContainer container, string prefix, Func<CloudBlockBlob, bool> condition = null, int? countEstimate = null) { List<CloudBlockBlob> list; if (countEstimate.HasValue) { list = new List<CloudBlockBlob>(countEstimate.Value); } else { list = new List<CloudBlockBlob>(); } BlobContinuationToken token = null; do { var segment = container.ListBlobsSegmented( prefix, useFlatBlobListing: true, blobListingDetails: BlobListingDetails.Copy, maxResults: null, currentToken: token, options: new BlobRequestOptions(), operationContext: new OperationContext()); var oldCount = list.Count; int total = 0; foreach (var blob in segment.Results.OfType<CloudBlockBlob>()) { if (condition == null || condition(blob)) { list.Add(blob); } total++; } log.Info("Matched {0}/{1} blobs in current segment. Found {2} blobs so far...", list.Count - oldCount, total, list.Count); token = segment.ContinuationToken; } while (token != null); return list; }
public void CloudBlobContainerListBlobsSegmented() { CloudBlobContainer container = GetRandomContainerReference(); try { container.Create(); List <string> blobNames = CreateBlobs(container, 3, BlobType.PageBlob); BlobContinuationToken token = null; do { BlobResultSegment results = container.ListBlobsSegmented(null, true, BlobListingDetails.None, 1, token, null, null); int count = 0; foreach (IListBlobItem blobItem in results.Results) { Assert.IsInstanceOfType(blobItem, typeof(CloudPageBlob)); Assert.IsTrue(blobNames.Remove(((CloudPageBlob)blobItem).Name)); count++; } Assert.IsTrue(count >= 1); token = results.ContinuationToken; }while (token != null); Assert.AreEqual(0, blobNames.Count); } finally { container.DeleteIfExists(); } }
public BlobResultSegment ListBlobsSegmented(string prefix, bool useFlatBlobListing, BlobListingDetails blobListingDetails, int?maxResults, BlobContinuationToken currentToken, BlobRequestOptions options, OperationContext operationContext) { string containerName; string listingPrefix; CloudBlobClient.ParseUserPrefix(prefix, out containerName, out listingPrefix); CloudBlobContainer container = this.GetContainerReference(containerName); return(container.ListBlobsSegmented(listingPrefix, useFlatBlobListing, blobListingDetails, maxResults, currentToken, options, operationContext)); }
public static IEnumerable<CloudBlockBlob> EnumerateBlobs(Logger log, CloudBlobContainer container, string prefix, Func<CloudBlockBlob, bool> condition = null) { BlobContinuationToken token = null; do { var segment = container.ListBlobsSegmented( prefix, useFlatBlobListing: true, blobListingDetails: BlobListingDetails.Copy, maxResults: null, currentToken: token, options: new BlobRequestOptions(), operationContext: new OperationContext()); foreach (var blob in segment.Results.OfType<CloudBlockBlob>().Where(b => condition == null || condition(b))) { yield return blob; } token = segment.ContinuationToken; } while (token != null); }
/// List part of blobs. /// </summary> /// <param name="prefix">Blob prefix</param> /// <param name="useFlatBlobListing">Use flat blob listing</param> /// <param name="blobListingDetails">Blob listing details.</param> /// <param name="maxResults">Max results.</param> /// <param name="currentToken">Current token.</param> /// <param name="options">Request options</param> /// <param name="operationContext">Operation Context.</param> /// <returns>BlobResultSegment object</returns> public BlobResultSegment ListBlobsSegmented(CloudBlobContainer container, string prefix, bool useFlatBlobListing, BlobListingDetails blobListingDetails, int? maxResults, BlobContinuationToken currentToken, BlobRequestOptions options, OperationContext operationContext) { return container.ListBlobsSegmented(prefix, useFlatBlobListing, blobListingDetails, maxResults, currentToken, options, operationContext); }
private static void TestAccessTask(BlobContainerPublicAccessType accessType, CloudBlobContainer container, CloudBlob inputBlob) { StorageCredentials credentials = new StorageCredentials(); container = new CloudBlobContainer(container.Uri, credentials); CloudPageBlob blob = new CloudPageBlob(inputBlob.Uri, credentials); if (accessType.Equals(BlobContainerPublicAccessType.Container)) { blob.FetchAttributesAsync().Wait(); BlobContinuationToken token = null; do { BlobResultSegment results = container.ListBlobsSegmented(token); results.Results.ToArray(); token = results.ContinuationToken; } while (token != null); container.FetchAttributesAsync().Wait(); } else if (accessType.Equals(BlobContainerPublicAccessType.Blob)) { blob.FetchAttributesAsync().Wait(); TestHelper.ExpectedExceptionTask( container.ListBlobsSegmentedAsync(null), "List blobs while public access does not allow for listing", HttpStatusCode.NotFound); TestHelper.ExpectedExceptionTask( container.FetchAttributesAsync(), "Fetch container attributes while public access does not allow", HttpStatusCode.NotFound); } else { TestHelper.ExpectedExceptionTask( blob.FetchAttributesAsync(), "Fetch blob attributes while public access does not allow", HttpStatusCode.NotFound); TestHelper.ExpectedExceptionTask( container.ListBlobsSegmentedAsync(null), "List blobs while public access does not allow for listing", HttpStatusCode.NotFound); TestHelper.ExpectedExceptionTask( container.FetchAttributesAsync(), "Fetch container attributes while public access does not allow", HttpStatusCode.NotFound); } }
private List<string> EnumerateBlobsInContainer(CloudBlobContainer logsContainer, string blobPrefix) { var blobNames = new List<string>(); int pagingCount = 1000; var continuationToken = new BlobContinuationToken(); var context = new OperationContext(); context.ClientRequestID = "LogAnalysisTool"; BlobResultSegment resultSegment; //Check whether there are more results and list them in pages of 1000. do { resultSegment = logsContainer.ListBlobsSegmented( blobPrefix, true, BlobListingDetails.Snapshots, pagingCount, continuationToken, null, context); foreach (IListBlobItem blobItem in resultSegment.Results) { string blobName; blobName = blobItem.Uri.AbsolutePath.Remove(0, "/$logs/blob/".Length); blobNames.Add(blobName); } continuationToken = resultSegment.ContinuationToken; } while (continuationToken != null); return blobNames; }
public void CloudBlobClientListBlobsSegmentedWithEmptyPrefix() { string name = "bb" + GetRandomContainerName(); CloudBlobClient blobClient = GenerateCloudBlobClient(); CloudBlobContainer rootContainer = blobClient.GetRootContainerReference(); CloudBlobContainer container = blobClient.GetContainerReference(name); try { rootContainer.CreateIfNotExists(); container.Create(); List <Uri> preExistingBlobs = rootContainer.ListBlobs().Select(b => b.Uri).ToList(); List <string> blobNames = CreateBlobs(container, 3, BlobType.BlockBlob); List <string> rootBlobNames = CreateBlobs(rootContainer, 2, BlobType.BlockBlob); BlobResultSegment results; BlobContinuationToken token = null; List <Uri> listedBlobs = new List <Uri>(); do { results = blobClient.ListBlobsSegmented("", token); token = results.ContinuationToken; foreach (IListBlobItem blob in results.Results) { if (preExistingBlobs.Contains(blob.Uri)) { continue; } else { if (blob is CloudPageBlob) { ((CloudPageBlob)blob).Delete(); } else { ((CloudBlockBlob)blob).Delete(); } listedBlobs.Add(blob.Uri); } } }while (token != null); Assert.AreEqual(2, listedBlobs.Count); do { results = container.ListBlobsSegmented("", false, BlobListingDetails.None, null, token, null, null); token = results.ContinuationToken; foreach (IListBlobItem blob in results.Results) { if (preExistingBlobs.Contains(blob.Uri)) { continue; } else { if (blob is CloudPageBlob) { ((CloudPageBlob)blob).Delete(); } else { ((CloudBlockBlob)blob).Delete(); } listedBlobs.Add(blob.Uri); } } }while (token != null); Assert.AreEqual(5, listedBlobs.Count); } finally { container.DeleteIfExists(); } }