2017-05-12 4 views
1

Ich brauche einen Archivbereinigungscode, um alte Azure-Protokolle nach einer bestimmten Aufbewahrungsdauer zu entfernen.C# Abrufen einer Liste von Blobs aus Azure

Ich weiß, dass ich das tun kann:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(""); 
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
CloudBlobContainer container = blobClient.GetContainerReference("ctr"); 

var blobList = container.ListBlobs(); 
foreach(var blob in blobList) 
{ 
    logger.Info($"Blob Name: {blob.Uri}"); 
} 

jedoch in meinem Container die Struktur

/ 
/year/month/day/hour/files 

jetzt So gibt es

/2017/5/11/14/files 
/2017/5/11/17/files 
/2017/5/11/22/files 
/2017/5/11/23/files 

und

/2017/5/12/11/files 

Wo Dateien mehrere Sicherungsdateien sind.

Die for-Schleife hat nur 1 Element in ihrer Sammlung, da der Ordner 2017 der Stammordner ist.

Gibt es eine Möglichkeit, alle Blobs abzurufen?

Das Endziel besteht darin, alle Blobs zu löschen, die älter als die Aufbewahrungsfrist sind.

Antwort

2

Verwenden Sie den UseFlatBlobListing Parameter wie folgt aus:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(""); 
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
CloudBlobContainer container = blobClient.GetContainerReference("ctr"); 

var blobList = container.ListBlobs(useFlatBlobListing: true) 
foreach(var blob in blobList) 
{ 
    logger.Info($"Blob Name: {blob.Uri}"); 
} 

Diese finden Sie alle Blobs in einer abgeflachten Weise geben.

Siehe https://docs.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage.blob.cloudblobcontainer.listblobs?view=azure-dotnet

Wenn Sie auch die prefix Parameter umfassen Sie die Ergebnisse auf der Grundlage der Ordnerstruktur filtern. Um alles im Mai 2017 zu bekommen, können Sie tun

var blobList = container.ListBlobs(prefix: "2017/5/", useFlatBlobListing: true) 

Dies könnte helfen, die Liste der Blobs abhängig von Ihrer Aufbewahrung zu reduzieren.

1

Versuchen Sie dieses Muster. Kann beim Durchsuchen großer Speicher nützlich sein. Ich fand es viel mehr GC und Speicher Fußabdruck freundlich

var blobAccount = "<account>"; 
var apiKey = "<api-key>"; 
var containerName = "<container>"; 
var storageCredentials = new StorageCredentials(blobAccount, apiKey); 

var account = new CloudStorageAccount(storageCredentials, true); 
var blobClient = account.CreateCloudBlobClient(); 
var container = blobClient.GetContainerReference(containerName); 
var blobLimit = 500 

if (container == null) { return; } 

var blobContinuationToken = new BlobContinuationToken(); 

using (var fs = new FileStream("Output.csv", FileMode.Create)) 
{ 
    var sw = new StreamWriter(fs); 
    sw.WriteLine("Type,Name,Length"); 

    BlobContinuationToken continuationToken = null; 
    do 
    { 
     var blobList = container.ListBlobsSegmented("", 
            true, 
            BlobListingDetails.Metadata, 
            blobLimit, 
            continuationToken, 
            new BlobRequestOptions 
            { 
             LocationMode = LocationMode.PrimaryOnly 
            }, 
            null); 

     continuationToken = blobList.ContinuationToken; 

     // I was looking only for BlockBlobs 
     foreach (var item in blobList.Results.OfType<CloudBlockBlob>()) 
     { 
      sw.WriteLine($"block,\"{item.Name}\",{item.Properties.Length}"); 
     } 

    } while (continuationToken != null); 
} 
+1

Dies senkte meinen Fußabdruck von 12 GB Speicher auf etwa 100 MB, perfekt! – CLRBTH

Verwandte Themen