11

Dire che sto generando un paio di file json ogni giorno nella mia memoria BLOB. Quello che voglio fare è ottenere l'ultimo file modificato in una delle mie directory. Quindi mi piacerebbe avere qualcosa di simile a questo nel mio blob:Ottenere l'ultimo file modificato da Azure Blob

2016/01/02/test.json 
2016/01/02/test2.json 
2016/02/03/test.json 

voglio ottenere 2016/02/03/test.json. Quindi un modo è ottenere il percorso completo del file e fare un controllo regolare per trovare l'ultima directory creata, ma questo non funziona se ho più di un file josn in ogni directory. C'è qualcosa come File.GetLastWriteTime per ottenere l'ultimo file modificato? Sto usando questi codici per ottenere tutti i file BTW:

public static CloudBlobContainer GetBlobContainer(string accountName, string accountKey, string containerName) 
{ 
    CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true); 
    // blob client 
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
    // container 
    CloudBlobContainer blobContainer = blobClient.GetContainerReference(containerName); 
    return blobContainer; 
} 

public static IEnumerable<IListBlobItem> GetBlobItems(CloudBlobContainer container) 
{ 
    IEnumerable<IListBlobItem> items = container.ListBlobs(useFlatBlobListing: true); 
    return items; 
} 

public static List<string> GetAllBlobFiles(IEnumerable<IListBlobItem> blobs) 
{ 
    var listOfFileNames = new List<string>(); 

    foreach (var blob in blobs) 
    { 
     var blobFileName = blob.Uri.Segments.Last(); 
     listOfFileNames.Add(blobFileName); 
    } 
    return listOfFileNames; 
} 
+1

infine come si ottengono questi scenari per il percorso di più cartelle con l'ultima proprietà modificata? – Neo

risposta

15

Ogni IListBlobItem sta per essere un CloudBlockBlob, un CloudPageBlob, o un CloudBlobDirectory.

Dopo la fusione per bloccare o una pagina blob, o la loro base condivisa classe CloudBlob (preferibilmente utilizzando la parola chiave as e controllo per null), è possibile accedere alla data di modifica tramite blockBlob.Properties.LastModified.

Si noti che l'implementazione eseguirà una scansione O (n) su tutti i BLOB nel contenitore, che può richiedere un po 'di tempo se ci sono centinaia di migliaia di file. Al momento non c'è modo di fare una query più efficiente di blob storage, (a meno che non si abusi il nome del file e si codifichi la data in modo che le date più recenti vengano in ordine alfabetico per prime). Realisticamente, se hai bisogno di prestazioni migliori per le query, ti consiglio di tenere a portata di mano una tabella di database che rappresenti tutti gli elenchi di file come righe, con elementi come una colonna DateModified indicizzata da cercare e una colonna con il percorso blob per un facile accesso al file.

+0

E le directory? come accedere al loro ultimo orario modificato? –

+0

Directory? Intendi contenitori? O intendi il costrutto delimitatore del percorso artificiale che i nomi blob possono avere? –

+0

Il successivo (il costrutto delimitatore del percorso artificiale che i nomi blob possono avere) –

7

Come detto da Yar, è possibile utilizzare la proprietà LastModified di un singolo oggetto blob. Ecco un frammento di codice che mostra come farlo, una volta che hai un riferimento al contenitore corretto:

var latestBlob = container.ListBlobs() 
    .OfType<CloudBlockBlob>() 
    .OrderByDescending(m => m.Properties.LastModified) 
    .ToList() 
    .First(); 

Nota: il tipo di blob può non essere <CloudBlockBlob>. Assicurati di cambiarlo se necessario.