it-swarm.com.ru

Получение последнего файла, измененного из BLOB-объекта Azure

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

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;
}
14
Yar

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

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

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

22
Mike Asdf

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

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

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

8
Zachary Keener

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

2
viperguynaz

В случае проблемы используйте blockBlob.Container.Properties.LastModified

0
Prashant N