wake-up-neo.com

Die neueste Datei wird von Azure Blob geändert

Angenommen, ich generiere jeden Tag ein paar json-Dateien in meinem Blob-Speicher. Ich möchte, dass die neueste Datei in einem meiner Verzeichnisse geändert wird. So würde ich so etwas in meinem Blob haben:

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

Ich möchte 2016/02/03/test.json. Eine Möglichkeit besteht darin, den vollständigen Pfad der Datei abzurufen und eine Regex-Überprüfung durchzuführen, um das zuletzt erstellte Verzeichnis zu finden. Dies funktioniert jedoch nicht, wenn in jedem Verzeichnis mehr als eine josn-Datei vorhanden ist. Gibt es etwas wie File.GetLastWriteTime, um die zuletzt geänderte Datei abzurufen? Ich verwende diese Codes, um 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;
}
14
Yar

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

Nach dem Umsetzen in Block- oder Seiten-Blob oder ihrer gemeinsam genutzten Basisklasse CloudBlob (vorzugsweise mit dem Schlüsselwort as und Überprüfen auf null) können Sie über blockBlob.Properties.LastModified auf das geänderte Datum 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. Eine effizientere Abfrage des Blob-Speichers ist derzeit jedoch nicht möglich (es sei denn, Sie missbrauchen die Dateinamen und verschlüsseln das Datum so, dass neuere Daten alphabetisch an erster Stelle stehen). Wenn Sie eine bessere Abfrageleistung benötigen, empfiehlt es sich, eine Datenbanktabelle zur Verfügung zu haben, die alle Dateilisten als Zeilen darstellt. Dazu gehören eine indizierte DateModified-Spalte, nach der gesucht werden soll, und eine Spalte mit dem Blob-Pfad für den einfachen Zugriff auf die Datei.

22
Mike Asdf

Wie Yar sagt, können Sie die LastModified-Eigenschaft eines einzelnen Blob-Objekts verwenden. Hier ist ein Codeausschnitt, der zeigt, wie das geht, sobald Sie einen Verweis auf den richtigen Container haben:

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

Hinweis: Der Blob-Typ darf nicht <CloudBlockBlob> sein. Ändern Sie dies unbedingt, wenn nötig.

8
Zachary Keener

Verwenden Sie das Azure Web Jobs-SDK . Das SDK bietet Optionen zum Überwachen auf neue/aktualisierte BLOBs.

2
viperguynaz

Bei Problemen verwenden Sie blockBlob.Container.Properties.LastModified

0
Prashant N