web-dev-qa-db-fra.com

Obtention du dernier fichier modifié à partir d'Azure Blob

Supposons que je génère deux ou trois fichiers json chaque jour dans mon espace de stockage d'objets blob. Ce que je veux faire, c'est faire modifier le dernier fichier dans l'un de mes répertoires. Donc, j'aurais quelque chose comme ça dans mon blob:

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

Je veux obtenir 2016/02/03/test.json. Ainsi, un moyen consiste à obtenir le chemin complet du fichier et à effectuer une vérification regex pour rechercher le dernier répertoire créé, mais cela ne fonctionne pas si j'ai plus d'un fichier josn dans chaque répertoire. Existe-t-il quelque chose comme File.GetLastWriteTime pour obtenir le dernier fichier modifié? J'utilise ces codes pour obtenir tous les fichiers:

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

Chaque IListBlobItem va être un CloudBlockBlob, un CloudPageBlob ou un CloudBlobDirectory.

Après avoir diffusé un blob de bloc ou de page, ou leur classe de base partagée CloudBlob (de préférence en utilisant le mot clé as et en vérifiant la valeur null), vous pouvez accéder à la date de modification via blockBlob.Properties.LastModified.

Notez que votre implémentation effectuera une analyse O(n) sur tous les blobs du conteneur, ce qui peut prendre un certain temps s'il existe des centaines de milliers de fichiers. Cependant, il n’existe actuellement aucun moyen de rechercher plus efficacement le stockage des objets blob (à moins d’abuser de la dénomination du fichier et de coder la date de manière à ce que les nouvelles dates arrivent en premier par ordre alphabétique). En réalité, si vous avez besoin de meilleures performances de requête, nous vous recommandons de garder une table de base de données à portée de main qui représente toutes les listes de fichiers sous forme de lignes, avec des éléments comme une colonne DateModified indexée dans laquelle effectuer la recherche et une colonne avec le chemin d'objet pour un accès facile au fichier.

22
Mike Asdf

Comme Yar l'a dit, vous pouvez utiliser la propriété LastModified d'un objet blob individuel. Voici un extrait de code qui montre comment procéder, une fois que vous avez une référence au bon conteneur:

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

Remarque: Le type de blob peut ne pas être <CloudBlockBlob>. Assurez-vous de changer cela si nécessaire.

8
Zachary Keener

Utilisez le SDK Azure Web Jobs . Le Kit de développement logiciel (SDK) dispose d’options pour surveiller les BLOB nouveaux/mis à jour.

2
viperguynaz

En cas de problème, utilisez blockBlob.Container.Properties.LastModified

0
Prashant N