Получение последнего файла, измененного с 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.