11

Angenommen, ich erstelle jeden Tag ein paar json Dateien in meinem Blobspeicher. Ich möchte die neueste Datei in einem meiner Verzeichnisse ändern. Also würde ich so etwas in meinem Blob haben:Abrufen der neuesten Datei von Azure Blob

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

Ich möchte 2016/02/03/test.json bekommen. Ein Weg besteht also darin, den vollständigen Pfad der Datei zu ermitteln und eine Regex-Überprüfung durchzuführen, um das zuletzt erstellte Verzeichnis zu finden. Dies funktioniert jedoch nicht, wenn ich in jedem Verzeichnis mehr als eine Datei josn habe. Gibt es etwas wie File.GetLastWriteTime, um die zuletzt geänderte Datei zu erhalten? ich diese Codes verwenden btw alle Dateien zu erhalten:

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

endlich, wie Sie diese Szenarien für mehrere Ordner Pfad mit zuletzt geänderten Eigenschaft erreichen? – Neo

Antwort

15

Jeder IListBlobItem ein CloudBlockBlob sein wird, ein CloudPageBlob oder ein CloudBlobDirectory.

Nach dem Gießen oder Seiten-Blob zu blockieren oder ihre gemeinsamen Basisklasse CloudBlob (vorzugsweise durch das as Schlüsselwort und Überprüfung auf null verwenden), können Sie das Änderungsdatum über blockBlob.Properties.LastModified zugreifen.

Beachten Sie, dass Ihre Implementierung einen O (n) -Scan über alle Blobs im Container durchführt, was bei Hunderttausenden von Dateien eine Weile dauern kann. Es gibt derzeit keine Möglichkeit, eine effizientere Abfrage des Blobspeichers durchzuführen (es sei denn, Sie missbrauchen die Dateinamen und kodieren das Datum so, dass neuere Daten alphabetisch vorangestellt werden). Wenn Sie eine bessere Abfrageleistung benötigen, empfiehlt es sich, eine Datenbanktabelle bereitzuhalten, die alle Dateilisten als Zeilen darstellt, beispielsweise mit einer indexierten DateModified-Spalte und einer Spalte mit dem Blob-Pfad für den einfachen Zugriff auf die Datei.

+0

Was ist mit Verzeichnissen? Wie kann ich auf die zuletzt geänderte Zeit zugreifen? –

+0

Verzeichnisse? Meinst du Container? Oder meinst du das künstliche Wegbegrenzer-Konstrukt, das Blobnamen haben können? –

+0

Die spätere (das künstliche Pfadbegrenzer-Konstrukt, das Blobnamen haben können) –

7

Wie Yar sagte, können Sie die LastModified Eigenschaft eines einzelnen Blob-Objekts verwenden. Hier ist ein Code-Snippet, das zeigt, wie das tun, wenn Sie einen Verweis auf die richtigen Behälter haben:

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

Hinweis: Der Blob-Typ nicht <CloudBlockBlob> sein kann. Stellen Sie sicher, dass Sie dies bei Bedarf ändern.

Verwandte Themen