Получение последнего файла, измененного с Azure Blob

Скажем, я генерирую пару файлов json каждый день в своем блочном хранилище. Я хочу сделать, чтобы последний файл был изменен в любом из моих каталогов. Поэтому у меня было бы что-то вроде этого в моем блобе:

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

Я хочу получить 2016/02/03/test.json. Таким образом, одним из способов является получение полного пути к файлу и проверка регулярных выражений, чтобы найти последний созданный каталог, но это не работает, если у меня есть более одного файла josn в каждом каталоге. Есть ли что-нибудь вроде File.GetLastWriteTime для получения последнего измененного файла? Я использую эти коды, чтобы получить все файлы:

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

Каждый IListBlobItem будет CloudBlockBlob, CloudPageBlob или CloudBlobDirectory.

После кастинга на блочном блоке или блоге страницы или в их общем базовом классе CloudBlob (желательно с помощью ключевого слова as и проверки нулевого значения) вы можете получить доступ к измененной дате через blockBlob.Properties.LastModified.

Обратите внимание, что ваша реализация будет выполнять проверку O (n) поверх всех блоков в контейнере, что может занять некоторое время, если есть сотни тысяч файлов. В настоящее время нет способа сделать более эффективный запрос памяти blob, хотя (если вы не злоупотребляете именованием файлов и не кодируете дату таким образом, чтобы новые даты в алфавитном порядке начинались первым). Реально, если вам нужна более высокая производительность запросов, я бы рекомендовал хранить таблицу базы данных в удобном виде, которая представляет все списки файлов в виде строк, причем такие вещи, как индексированный столбец DateModified для поиска, и столбец с контуром blob для легкого доступа к файлу.

Ответ 2

Как сказал Яр, вы можете использовать свойство LastModified для отдельного объекта blob. Вот фрагмент кода, который показывает, как это сделать, как только у вас есть ссылка на правильный контейнер:

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

Примечание. Тип blob может не быть <CloudBlockBlob>. Обязательно измените это, если необходимо.

Ответ 3

Используйте Azure Web Jobs SDK. В SDK есть опции для мониторинга новых/обновленных BLOB.