2017-05-12 101 views
1

我需要一些存檔清理代碼來在發生特定保留期後刪除舊的Azure日誌。C#從Azure中檢索blob列表

我知道我能做到這一點:

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

但是我的容器內的結構是

/ 
/year/month/day/hour/files 

所以現在有

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

/2017/5/12/11/files 

其中文件是多個備份文件。

由於2017文件夾是根,所以for循環僅在其集合中包含1個項目。

有沒有辦法檢索所有的斑點?

最終目標是刪除保留期之前的所有斑點。

回答

2

使用UseFlatBlobListing參數是這樣的:

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

這會給你一個扁平的方式,所有的斑點。

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

如果您還包括prefix參數可以篩選基於文件夾結構的結果。要在2017年5月份獲得所有內容,您可以做

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

這可能有助於根據您的保留情況減少斑點列表。

1

試試這種模式。在瀏覽大型存儲時可以很方便。我發現它更多的GC和內存足跡友好

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

這降低了我的足跡從12GB的內存大約100MB,完美! – CLRBTH